Hogyan kötni egy CheckBox egy bool gépelt DbColumn hogy lehet üres?

szavazat
4

Windows Forms (.NET 2.0, a Visual Studio 2005 SP1): Már egy gépelt DataSet, egy oszlop, amely a típus System.Boolean, amely lehet üres, és amely alapértelmezett érték DBNull. Van egy Form, amely egy CheckBoxkontroll, hogy szeretnék, hogy kötődik az előzetes oszlop értékét.

  • Megpróbáltam kötni a Checkedtulajdonság az oszlopra juttatják a tervező: ez remekül működik, csak akkor, ha az alapértelmezett érték az oszlop beállítása sem Truevagy False.
  • Megpróbáltam kötni a CheckStatetulajdonság az oszlopra juttatják a tervező, és csatolva a saját Formatés Parseeseménykezelőkkel de soha nem kap hívják:

    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
    };
    
  • Megpróbáltam létrehozni egy egyéni Bindingpéldául a kódot, mellékelem eseménykezelőkkel és add meg a CheckBoxkötések: az esemény rakodók még soha nem hívott ...

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

Mint egy megjegyzés: a DBNullérték elfogadható, ha csak bol DataSet(ez az az érték, még soha nem volt beállítva). De a felhasználó csak akkor tudja beállítani az értéket True, vagy Falsekeresztül CheckBox.

Referenciaként itt a kód az elemzési és formázási módszerek:

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;
}
A kérdést 13/08/2009 14:52
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
1

A easist így tudom, ez származhat CheckBox osztály, add „DataValue” tulajdonság, amely képes kezelni DBNull értékek és kötődnek az adatokat „DataValue” tulajdonság:

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;
            }
        }
    }
}
Válaszolt 18/08/2009 07:58
a forrás felhasználó

szavazat
7

Próbálta már kötelező CheckBox.CheckState a DataColumn nélkül kapcsolódó elemezze és formázza események vagy szórakozik a Binding?

Sajnos nem egy példányt a Visual Studio 2005 kapható, de én összeállított egy rövid űrlapot a Visual Studio 2008 és ez nem pontosan mit megadva:

Mint egy megjegyzés: a DBNull érték elfogadható, ha csak jön a DataSet (ez az az érték, még soha nem volt beállítva). De a felhasználó csak akkor tudja beállítani az értéket Igaz vagy hamis keresztül jelölőnégyzetet.

Lehet, hogy a Feldolgozási, formátum vagy kötődése kerülgetni, vagy lehet, hogy a Windows Forms másképp viselkedik 2008, mint 2005-ben


UPDATE augusztus 18: Úgy működik a Visual Studio 2005-ben is mind a tervező és a kódot. Itt a kód, amely bizonyítja, hogy működik:


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


UPDATE augusztus 23:

Miért működik

Binding saját metódust FormatObject amely felelős megszerzésére képviseletét érték érkező adatforrás, mely megfelelő bemutatják a vezérlő.

Amikor a formázás be van kapcsolva, Binding.FormatObject () fut át ​​egy kódot utat, hogy hívja esetleges rakodók van a Binding.Format esemény. Ha bármelyik kezelő megváltoztatja az értéket kell szaporítani az adatforrás a kontroll révén ConvertEventArgs.Value, akkor ezt az értéket kell használni. Ellenkező esetben, akkor hívja az alapértelmezett formázóterületen nevű FormatObject egy belső osztály nevezett System.Windows.Forms.Formatter.

A megjegyzések a forráskód állam:

„Az igazi átalakítási munkát belül történik FormatObjectInternal ()”

A megjegyzéseket FormatObjectInternal állam:

„Végrehajtja néhány speciális esetet konverziók (pl. Boolean hogy CheckState)”

Belül FormatObjectInternal azt ellenőrzi, hogy ha az érték jön az adatforrás null vagy DBNull, és ha ez a helyzet, akkor ellenőrzi, hogy a tulajdonság típusa van kötve úgy CheckState. Ha ez a helyzet, akkor visszatér CheckState.Indeterminate.

Mint látható, ez olyan gyakori eset, hogy egy meglepetés nem működik Windows Forms 1.x Szerencsére a fix azt 2.0 és azon túl.

Válaszolt 18/08/2009 11:25
a forrás felhasználó

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