Ein Kontrollkästchen zu einem bool getippt DbColumn zu binden, die NULL-Werte zulässt?

stimmen
4

In Windows Forms (.NET 2.0, Visual Studio 2005 SP1): Ich habe einen getippt DataSet, mit einer Säule , die Art ist System.Boolean, die NULL - Werte zulässt und der Standardwert ist DBNull. Ich habe ein Form, eine enthält CheckBoxSteuerelement , das ich auf den Stand der Spaltenwert binden möchten.

  • Ich habe versucht , das zu binden CheckedEigenschaft an die Säule über den Designer: es funktioniert super, nur dann , wenn der Standardwert für die Spalte entweder eingestellt ist Trueoder False.
  • Ich habe versucht , das zu binden CheckStateEigenschaft an die Säule über den Designer, und meine eigenen Befestigung Formatund ParseEvent - Handler , aber sie nie aufgerufen:

    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
    };
    
  • Ich habe versucht , eine benutzerdefinierte erstellen BindingBeispiel im Code, meine Event - Handler anhängen und an den Add - CheckBoxBindungen: Die Event - Handler noch nie aufgerufen ...

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

Als Anmerkung: a DBNullist Wert nur dann akzeptabel , wenn aus Richtung der DataSet(den Wert bedeutet , nie gesetzt wurde). Aber soll der Benutzer nur in der Lage sein , den Wert auf Trueoder Falseüber die CheckBox.

Als Referenz hier ist der Code der Parsen und Formatierungsmethoden:

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;
}
Veröffentlicht am 13/08/2009 um 14:52
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Der einfachste Weg ich weiß, ist von CheckBox-Klasse abgeleitet, „Datavalue“ Eigenschaft hinzufügen, die DBNull-Werte verarbeiten können und binden die Daten zu „Datavalue“ Eigenschaft:

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;
            }
        }
    }
}
Beantwortet am 18/08/2009 um 07:58
quelle vom benutzer

stimmen
7

Haben Sie versucht, CheckBox.CheckState an die Datacolumn Bindung ohne Befestigung mit der Bindung an Parse und Format Ereignisse oder Messing?

Ich habe nicht eine Instanz von Visual Studio 2005 zur Verfügung habe , aber ich zusammengebaut leider eine schnelle Form in Visual Studio 2008 und es tat genau , was Sie angegeben:

Als Hinweis: ist ein DBNull Wert nur dann akzeptabel, wenn sie aus dem Datensatz kommen (es bedeutet, hat sich der Wert nie gesetzt wurde). Aber soll der Benutzer nur in der Lage sein, den Wert auf Wahr oder Falsch über die CheckBox einzustellen.

Ich kann das Parse sein, Format oder Bindung im Weg oder es kann sein, dass Windows Forms anders im Jahr 2008 verhält als im Jahr 2005


UPDATE 18. August: Es funktioniert auf Visual Studio 2005 auch sowohl durch den Designer und durch Code. Hier ist der Code, es funktioniert demonstriert:


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 23. August:

Warum es funktioniert

Die Bindung hat eine private Methode aufgerufen, das format zum Erhalten einer Darstellung des Wertes verantwortlich ist, aus der Datenquelle kommen, die für die gezeigt wird, auf der Steuer geeignet ist.

Bei der Formatierung aktiviert ist, wird Binding.FormatObject () durch einen Codepfad ausführen, die eventuell Handler aufrufen werden Sie für die Binding.Format Veranstaltung. Wenn irgendein Handler ändert sich der Wert von der Datenquelle durch ConvertEventArgs.Value an die Steuer ausbreitet, wird dieser Wert verwendet werden. Ansonsten wird es ein Standard-Formatierungsprogramm aufrufen format auf einer internen Klasse namens System.Windows.Forms.Formatter genannt.

Die Kommentare zu dem Quellcode Zustand:

„Die eigentliche Umwandlung Arbeit geschieht innerhalb FormatObjectInternal ()“

Die Kommentare für FormatObjectInternal Zustand:

„Führt einige Sonderfallkonvertierungen (zB. Auf Checkstate Boolean)“

Innerhalb von FormatObjectInternal prüft er, ob der Wert aus der Datenquelle kommt, ist null oder DBNull, und wenn das der Fall ist, überprüft er, ob die Art der Immobilie gebunden zu sein von Checkstate ist. Wenn das der Fall ist, gibt es CheckState.Indeterminate.

Wie Sie sehen können, ist dies ein solcher gemeinsamer Fall, dass es eine Überraschung ist es nicht unter Windows funktionierte 1.x Forms Zum Glück legt der es auf 2,0 und darüber hinaus.

Beantwortet am 18/08/2009 um 11:25
quelle vom benutzer

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