कैसे एक bool टाइप किया DbColumn कि व्यर्थ है के लिए एक चेकबॉक्स बाध्य करने के लिए?

वोट
4

Windows Forms (.NET 2.0, विजुअल स्टूडियो 2005 SP1) में: मैं एक टाइप किया है DataSetएक स्तंभ प्रकार है जिसके साथ, System.Booleanहै, जो व्यर्थ है और जो डिफ़ॉल्ट मान है DBNull। मैं एक है Formएक से युक्त, CheckBoxनियंत्रण है कि मैं पहले स्तंभ मान करने के लिए बाध्य करना चाहते हैं।

  • मैं बाध्य करने की कोशिश की है Checkedडिजाइनर के माध्यम से स्तंभ के लिए संपत्ति: यह काम करता है महान, स्तंभ के लिए डिफ़ॉल्ट मान या तो करने के लिए सेट है तभी Trueया False
  • मैं बाध्य करने की कोशिश की है CheckStateडिजाइनर के माध्यम से स्तंभ के लिए संपत्ति, और अपने ही संलग्न Formatऔर Parseईवेंट हैंडलर्स लेकिन वे कभी नहीं कहा जाता हो:

    b.Format+=delegate(object sender, ConvertEventArgs cevent) {
        cevent.Value=DoFormat((CheckState)cevent.Value); // cf. end of the question
    };
    b.Parse+=delegate(object sender, ConvertEventArgs cevent) {
        cevent.Value=DoParse(cevent.Value); // cf. end of the question
    };
    
  • मैं एक कस्टम बनाने के लिए कोशिश की है Bindingकोड में उदाहरण के लिए, मेरे ईवेंट हैंडलर्स देते हैं और में जोड़ने CheckBoxबाइंडिंग: ईवेंट हैंडलर्स अभी भी कहा जाता हो कभी नहीं कर रहे हैं ...

    Binding b=new Binding(CheckState, _BindingSource, MyColumn, false, DataSourceUpdateMode.OnPropertyChanged, DBNull.Value);
    

एक नोट के रूप में: एक DBNullमूल्य स्वीकार्य केवल जब आने से है DataSet(यह मूल्य का मतलब सेट नहीं किया गया है)। लेकिन उपयोगकर्ता केवल करने के लिए मान सेट करने के लिए सक्षम होना चाहिए Trueया Falseके माध्यम से CheckBox

संदर्भ के लिए, पार्स करने और प्रारूपण विधि कोड है:

internal static CheckState DoParse(object value)
{
    if ((value==null) || (value is DBNull))
        return CheckState.Indeterminate;

    bool v=Convert.ToBoolean(value);
    return (v ? CheckState.Checked : CheckState.Unchecked);
}

internal static object DoFormat(CheckState value)
{
    switch (value)
    {
    case CheckState.Checked:
        return true;
    case CheckState.Indeterminate:
        return DBNull.Value;
    case CheckState.Unchecked:
        return false;
    }

    return null;
}
13/08/2009 को 14:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
1

easist रास्ता मुझे पता है, चेकबॉक्स वर्ग से निकाले जाते हैं, जोड़ें "DataValue" संपत्ति जो DBNull मानों का प्रबंधन और डेटा बाध्य करने के लिए "DataValue" संपत्ति कर सकते हैं:

public class DataCheckBox : CheckBox {
    public virtual object DataValue {
        get { return this.Checked; }
        set {
            if ( value == null || value is DBNull ) {
                this.CheckState = CheckState.Indeterminate;
            }
            else {
                this.Checked = (bool)value;
            }
        }
    }
}
18/08/2009 को 07:58
का स्रोत उपयोगकर्ता

वोट
7

आप स्वरूप घटनाओं पार्स और करने के लिए संलग्न या बाध्यकारी के साथ खिलवाड़ के बिना DataColumn के लिए बाध्य CheckBox.CheckState की कोशिश की?

दुर्भाग्य से मैं दृश्य स्टूडियो 2005 उपलब्ध का एक उदाहरण नहीं है, लेकिन मैं विजुअल स्टूडियो 2008 में एक त्वरित रूप इकट्ठा किया और यह किया वास्तव में आप निर्दिष्ट:

एक नोट के रूप में: एक DBNull मूल्य केवल जब डेटासेट (इसका मतलब है कि मान सेट नहीं किया गया है) से आ रही स्वीकार्य है। लेकिन उपयोगकर्ता केवल चेकबॉक्स के माध्यम से सही है या गलत के लिए मूल्य निर्धारित करने में सक्षम होना चाहिए।

मैं पार्स हो सकता है, इस तरह फॉर्मेट या अपने रास्ते में बाध्यकारी हो रही है या यह हो सकता है कि Windows Forms 2005 में से 2008 में अलग ढंग से व्यवहार करती है


अद्यतन अगस्त 18: यह दृश्य स्टूडियो 2005 भी दोनों डिजाइनर के माध्यम से और कोड के माध्यम से काम करता है। यहाँ कोड है कि यह दर्शाता है काम कर रहा है:


using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        DataTable table = new DataTable();
        public Form1() {
            InitializeComponent();

            //Creates the table structure
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("MyColumn", typeof(bool));

            //Populates the table with some stuff
            for (int i = 0; i < 5; i++) {
                table.Rows.Add(i.ToString());
            }

            //Creates the controls and puts them on the form.
            TextBox textBox = new TextBox();
            textBox.Location = new Point(10, 10);
            textBox.DataBindings.Add("Text", table, "Name");

            CheckBox checkBox = new CheckBox();
            checkBox.Left = textBox.Left;
            checkBox.Top = textBox.Bottom + 10;

            //Without true on the last argument, it will not work properly.
            checkBox.DataBindings.Add("CheckState", table, "MyColumn", true);

            Button previous = new Button();
            previous.Text = "";
            next.Top = previous.Top;
            next.Left = previous.Right + 5;
            next.Click += new EventHandler(next_Click);

            this.Controls.AddRange(new Control[] { textBox, checkBox, previous, next });
        }

        void next_Click(object sender, EventArgs e) {
            this.BindingContext[this.table].Position++;
        }

        void previous_Click(object sender, EventArgs e) {
            this.BindingContext[this.table].Position--;
        }
    }
}


अद्यतन अगस्त 23:

क्यों यह काम करता है

बाइंडिंग के लिए एक निजी विधि FormatObject कहा जाता है जो डेटा स्रोत है कि नियंत्रण पर दिखाया जा रहा के लिए उपयुक्त है से आ रही मूल्य का प्रतिनिधित्व प्राप्त करने के लिए जिम्मेदार है है।

जब स्वरूपण सक्षम किया गया है, Binding.FormatObject () एक कोड रास्ता है कि अंतिम संचालकों आप Binding.Format घटना के लिए है कॉल करेंगे के माध्यम से चलेंगे। किसी भी हैंडलर मूल्य ConvertEventArgs.Value के माध्यम से नियंत्रित करने के लिए डेटा स्रोत से प्रचारित किया जा रहा है बदल देता है, कि मूल्य का उपयोग किया जाएगा। अन्यथा, यह System.Windows.Forms.Formatter कहा जाता है एक आंतरिक वर्ग पर FormatObject के नाम से डिफाल्ट फ़ॉर्मेटर कॉल करेंगे।

स्रोत कोड राज्य पर टिप्पणी:

"वास्तविक रूपांतरण काम FormatObjectInternal अंदर होता है ()"

FormatObjectInternal राज्य के लिए टिप्पणियाँ:

"कुछ विशेष-केस रूपांतरण करता है (उदाहरण के लिए। CheckState को बुलियन)"

FormatObjectInternal के अंदर यह अगर डेटा स्रोत से आ रही मान शून्य या DBNull है और यदि यह मामला है, यह अगर संपत्ति के प्रकार के लिए बाध्य किया जा रहा CheckState की है देखने के लिए जाँच करता है देखने के लिए जाँच करता है। अगर ऐसा है, तो यह CheckState.Indeterminate देता है।

आप देख सकते हैं, इस तरह के एक सामान्य स्थिति है कि यह एक आश्चर्य यह विंडोज पर काम नहीं किया 1.x. रूपों सौभाग्य से, पर 2.0 और उससे आगे यह तय की।

18/08/2009 को 11:25
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more