Nasıl null DbColumn yazılan bir bool bir CheckBox bağlamak için?

oy
4

Windows Forms (.NET 2.0, Visual Studio 2005 SP1) içinde: Ben yazdığınız DataSettipi olan sütun ile, System.Booleannull ve varsayılan değerdir, DBNull. Bir sahip Formbir ihtiva eden, CheckBoxbir önceden sütun değeri bağlamak istediğiniz kontrolü.

  • Ben bağlamak çalıştık Checkedtasarımcı aracılığıyla kolona özelliği: büyük, sütun için varsayılan değer olarak ayarlanırsa durumunda çalışır Trueveya False.
  • Ben bağlamak çalıştık CheckStatetasarımcı aracılığıyla kolona özelliği ve kendi takılarak Formatve Parseolay işleyicileri ama onlar asla denilen olsun:

    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
    };
    
  • Özel bir oluşturmak için çalıştık Binding, kod örneği benim olay işleyicileri takmak ve eklemek CheckBoxbağlamaları: Olay işleyicileri hala denilen olsun asla ...

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

Bir not olarak: Bir DBNulldeğer yalnızca gelen kabul edilebilir DataSet(set olmamıştı o değer anlamına gelir). Ama kullanıcı sadece değer ayarlamak gerekir Trueya Falseyoluyla CheckBox.

Referans olması açısından, ayrıştırma ve biçimlendirme yöntemlerinin kodudur:

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;
}
Oluştur 13/08/2009 saat 14:52
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Biliyorum Easist yolu, DBNull değerlerini işlemek ve veriyi için "DataValue" özelliği bağlayabilirsiniz "DataValue" özelliği ekleyin CheckBox sınıfından türetmek geçerli:

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;
            }
        }
    }
}
Cevap 18/08/2009 saat 07:58
kaynak kullanıcı

oy
7

Biçim olayları Ayrıştırma ve iliştirmek veya Cilt ile karışıklık olmadan DataColumn CheckBox.CheckState bağlama denediniz?

Ne yazık ki Visual Studio mevcut 2005 örneği yok ama Visual Studio 2008 yılında hızlı bir şekilde monte ve onu yaptım aynen belirttiğiniz Ne:

Bir not olarak: Bir DBNull değeri DataSet (Bu değer set olmamıştı anlamına gelir) gelen sadece kabul edilebilir. Ama kullanıcı sadece CheckBox yoluyla Doğru veya Yanlış değeri ayarlamak mümkün olmalıdır.

Formatlayabilirim veya Bağlama hep yoluna, ayrıştırma olabilir veya Windows Forms 2005 yılında daha 2008 yılında farklı davrandığı olabilir


GÜNCELLEME 18 Ağustos: O Visual Studio 2005 de hem tasarımcı içinden ve kod üzerinden çalışır. İşte o çalışma gösterir kod:


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--;
        }
    }
}


GÜNCELLEME 23 Ağustos:

Neden işe yarar

Bağlanma kontrolü gösterilen için uygun olan bir veri kaynağından gelen değerin bir temsilini elde etmek için sorumlu olan FormatObject adlı özel bir yöntemi vardır.

Biçimlendirme etkinleştirildiğinde, Binding.FormatObject () Eğer Binding.Format olayı için sahip nihai işleyicileri arayacak bir kod yolu üzerinden yayınlanacak. Herhangi bir işleyici ConvertEventArgs.Value sayesinde kontrol veri kaynağından yayılmasını değeri değişir, bu değer kullanılır. Aksi takdirde, System.Windows.Forms.Formatter adlandırılan dahili sınıfına FormatObject adında bir varsayılan biçimlendirici arayacak.

Kaynak kodu durumuna yorumlar:

“Gerçek dönüşüm çalışmaları) (FormatObjectInternal içeride olur”

FormatObjectInternal devlet için yapılan yorumlar:

“(Örneğin. CheckState için Boolean) bazı özel durum dönüşümleri gerçekleştirir”

FormatObjectInternal içi veri kaynağından gelen değeri null veya DBNull değildir ve bu durumda ise, bu bağlı kalmaksızın mülkiyet türü checkState ait olup olmadığını denetler olmadığını denetler. Eğer durum ise, CheckState.Indeterminate döndürür.

Gördüğünüz gibi, bu o Windows üzerinde işe yaramadı sürpriz 1.x Forms olacak şekilde ortak bir durumdur Neyse ki, 2.0 ve ötesinde üzerinde düzelttim.

Cevap 18/08/2009 saat 11:25
kaynak kullanıcı

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