Announcement

Collapse
No announcement yet.

DateTimePicker

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DateTimePicker

    Hallo Andreas und alle zusammen,

    vor einigen Tagen hatte ich ein Problem mit dem DateTimePicker und Andreas und Christian Stasius haben mir ein paar Tipps gegeben. Erst mal vielen Dank dafür! Mein Problem ist ja, daß ich beim Neuanlegen eines Datensatzes in der Forms einen vollständig leeren Datensatz anzeigen soll, aber die DateTimePicker-Funktionalität und die sämtlichen ComboBox-Listen mit anbieten soll. Den Tipp von Christian mit der Eigenschaft ShowCheckBox und Checked habe ich gleich ausprobiert, leider funktioniert es bei mir nicht, weil - auch wenn das Feld im DataSet leer ist (mit diesem ist das Feld über ein Binding verbunden) - bei mir immer das MinDate angezeigt wird und das darf nicht kleiner als der "01.01.1753" sein (wahrscheinlich aus irgendeinem Init-File?). Ich kann weder MinDate, MaxDate noch Value irgendwie auf Null setzen. Außerdem klappt bei mir das "Checked" sofort selbständig auf "true" um, wenn ich das Feld mit irgendeinem Wert belege. Und wenn ich dann manuell "Checked" auf "false" setze, ist im "Disabled"-Style (grau) das vorbelegte Datum immer noch zu sehen. Was mache ich falsch, muß ich noch irgendwelche Events ins Spiel bringen?

    Vielen Dank für Eure Hilfe und viele Grüße (allmählich schon Weihnachtsgrüße!) von Rolf

  • #2
    Hallo,

    das folgende Beispiel demonstriert, wie sich die Jungs bei Microsoft die Sache mit dem DateTimePicker-Control vorgestellt haben.

    <b>a) Vorbereitung in der Datenbank tempdb des MS SQL Server 2000</b>
    <pre>
    USE tempdb
    GO

    CREATE TABLE DTPDemo (
    DTPDemoID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    Testeintrag VARCHAR(30) NOT NULL,
    TestDatum DATETIME )
    GO

    INSERT INTO DTPDemo (Testeintrag,TestDatum) VALUES ('Testeintag 1', '01.01.2002');
    INSERT INTO DTPDemo (Testeintrag,TestDatum) VALUES ('Testeintag 2', '18.12.2002');
    INSERT INTO DTPDemo (Testeintrag,TestDatum) VALUES ('Testeintag 3', '19.12.2002');
    INSERT INTO DTPDemo (Testeintrag) VALUES ('Testeintag 4');
    GO

    SELECT * FROM DTPDemo
    </pre>

    <b>b) Standardverhalten</b>

    - Tabelle DTPDemo vom Server Explorer auf das Formular ziehen <br>
    - rechter Mausklick auf sqlDataAdapter1 | DataSet anlegen <br>
    - DataBindings über Properties-Fenster konfigurieren
    <pre>
    ..
    this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.dataSet11, "DTPDemo.DTPDemoID"));
    ...
    </pre>
    - 2 Button zum Blättern:
    <pre>
    private void Form1_Load(object sender, System.EventArgs e)
    {
    this.sqlDataAdapter1.Fill(this.dataSet11);
    }
    private void button1_Click(object sender, System.EventArgs e)
    {
    this.BindingContext[dataSet11, "DTPDemo"].Position -= 1;
    }
    private void button2_Click(object sender, System.EventArgs e)
    {
    this.BindingContext[dataSet11, "DTPDemo"].Position += 1;
    }
    </pre>
    - Ergebnis: NULL-Wert der Spalte <i>TestDatum</i> wird beim letzten Datensatz im DateTimePicker als <b>aktuelles Datum</b> angezeigt

    <b>c) DateTimePicker-Eigenschaft ShowCheckBox im Properties-Fenster aktivieren</b>

    - 1..3.Testdatensatz: Spalte <i>TestDatum</i> hat einen Wert: Checkbox ist angekreuzt, schwarze Textfarbe<br>
    - 4. Testdatensatz: Spalte <i>TestDatum</i> ist NULL: Checkbox ist nicht angekreuzt, aktuelles Datum wird in grauer Textfarbe angezeigt<br>
    - Wird die Checkbox angekreuzt, kann ein neues Datum ausgewählt werden, dieses wird dann beim Browsen angezeigt

    Somit stellt das DateTimePicker-Control den NULL-Zustand visuell dar - allerdings bekommt man das Control nicht in den vollständig leeren Zustand.

    <b>d) neuen Datensatz: NULL bei abgewählter Checkbox</b>
    <pre>
    private CurrencyManager aCM;

    private void Form1_Load(object sender, System.EventArgs e)
    {
    this.sqlDataAdapter1.Fill(this.dataSet11);
    aCM = (CurrencyManager)BindingContext[dataSet11, "DTPDemo"];
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
    aCM.Position -= 1;
    }

    private void button2_Click(object sender, System.EventArgs e)
    {
    aCM.Position += 1;
    }

    private void buttonClear_Click(object sender, System.EventArgs e)
    {
    aCM.EndCurrentEdit();
    aCM.SuspendBinding();
    this.textBox1.Clear();
    this.textBox1.ReadOnly = true;
    this.textBox1.Clear();
    this.dateTimePicker1.Checked = false;
    }

    private void buttonNewSave_Click(object sender, System.EventArgs e)
    {
    if (this.dateTimePicker1.Checked)
    {
    this.dataSet11.DTPDemo.AddDTPDemoRow(this.textBox2 .Text, this.dateTimePicker1.Value);
    }
    else
    {
    DataRow aNewRow = this.dataSet11.Tables[0].NewRow();
    aNewRow.ItemArray = new object[] {null, this.textBox2.Text, null};
    this.dataSet11.DTPDemo.Rows.Add(aNewRow);
    }
    aCM.ResumeBinding();
    aCM.Position = aCM.Count - 1;
    this.textBox1.ReadOnly = false;
    }

    private void buttonUpdate_Click(object sender, System.EventArgs e)
    {
    aCM.EndCurrentEdit();
    this.sqlDataAdapter1.Update(this.dataSet11, "DTPDemo");
    }
    </pre>
    Ergebnis: Immer dann, wenn die Checkbox im DateTimePicker-Control abgewählt wird, landet NULL im neu angelegten Datensatz:

    SELECT * FROM DTPDemo
    <pre>
    DTPDemoID Testeintrag TestDatum
    ----------- ------------------------------ ------------------------------------------------------
    1 Testeintag 1 2002-01-01 00:00:00.000
    2 Testeintag 2 2002-12-18 00:00:00.000
    3 Testeintag 3 2002-12-19 00:00:00.000
    4 Testeintag 4 NULL
    5 Neu 5 check=false NULL
    6 Neu 6 check=true 16 2002-12-16 08:52:41.000

    (6 row(s) affected)
    </pre>

    Fazit: <br>
    Das direkte DataBinding macht beim DateTimePicker nur dann Sinn, wenn die dahinterliegende Spalte der Tabelle als NOT NULL gekennzeichnet ist und somit ein Datum zwingend erforderlich ist. In allen anderen Fällen würde ich ein normales TextBox-Control verwenden, und den DateTimePicker als optionalen separaten Dialog nur für das Auswählen eines Datums einblenden

    Comment

    Working...
    X