Πώς να δεσμεύσει ένα πλαίσιο ελέγχου σε μια bool πληκτρολογήσει DbColumn που είναι nullable;

ψήφοι
4

Στα έντυπα των Windows (.NET 2.0, το Visual Studio 2005 SP1): Έχω μια δακτυλογραφημένη DataSet, με μια στήλη που ο τύπος είναι System.Boolean, το οποίο είναι nullable και το οποίο προεπιλεγμένη τιμή είναι 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 τρόπος που ξέρω, είναι προέρχονται από CheckBox τάξη, προσθέστε το ακίνητο «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

Έχετε δοκιμάσει δεσμευτική CheckBox.CheckState στο DataColumn χωρίς να συνδέονται για να αναλύσει και εκδηλώσεις μορφή ή ρύπανση με τη δεσμευτική;

Δυστυχώς δεν έχω μια παρουσία του Visual Studio 2005 διαθέσιμα, αλλά θα συναρμολογηθεί μια γρήγορη μορφή στο Visual Studio 2008 και το έκανε ακριβώς αυτό που καθορίζονται:

Ως σημείωση: μια τιμή DBNull είναι αποδεκτή μόνο όταν προέρχονται από το σύνολο δεδομένων (αυτό σημαίνει ότι δεν έχει οριστεί η τιμή). Όμως, ο χρήστης θα πρέπει να είναι σε θέση να καθορίσει την τιμή να Σωστό ή Λάθος μέσω το πλαίσιο ελέγχου μόνο.

Μπορεί να είμαι ο μαϊντανός, τη μορφή, ή Δεσμευτική να πάρει το δρόμο σας ή μπορεί να είναι ότι τα Windows Forms συμπεριφέρεται διαφορετικά το 2008 σε σχέση με το 2005


UPDATE 18 Αύγ: Λειτουργεί σε Visual Studio 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--;
        }
    }
}


UPDATE 23η Αυγούστου:

Γιατί λειτουργεί

Δεσμευτική διαθέτει ιδιωτικό μέθοδο που ονομάζεται FormatObject η οποία είναι υπεύθυνη για τη λήψη μια αναπαράσταση της αξίας που προέρχεται από την πηγή δεδομένων που είναι κατάλληλη για να δείξει στον έλεγχο.

Κατά τη διαμόρφωση είναι ενεργοποιημένη, Binding.FormatObject () θα τρέξει μέσω ενός κωδικού μονοπάτι που θα καλέσει την ενδεχόμενη χειριστές που έχετε για την εκδήλωση Binding.Format. Αν κάποιος χειριστής αλλάζει την τιμή που διαδίδεται από την πηγή δεδομένων για τον έλεγχο μέσω ConvertEventArgs.Value, θα χρησιμοποιηθεί η τιμή. Σε αντίθετη περίπτωση, θα καλέσει έναν προεπιλεγμένο σύστημα διαμόρφωσης που ονομάζεται FormatObject σε μια εσωτερική τάξη που ονομάζεται System.Windows.Forms.Formatter.

Τα σχόλια για τον πηγαίο κώδικα του κράτους:

«Η πραγματική δουλειά μετατροπή συμβαίνει μέσα FormatObjectInternal ()»

Τα σχόλια για FormatObjectInternal κατάσταση:

«Εκτελεί κάποιες μετατροπές ειδική περίπτωση (π.χ.. Λογικό να CheckState)»

Μέσα από FormatObjectInternal ελέγχει για να δει αν η αξία που προέρχεται από την πηγή δεδομένων είναι μηδενική ή DBNull και αν αυτή είναι η περίπτωση, ελέγχει για να δει αν το είδος του ακινήτου που δεσμεύεται είναι CheckState. Αν αυτή είναι η περίπτωση, επιστρέφει CheckState.Indeterminate.

Όπως μπορείτε να δείτε, αυτό είναι μια τέτοια κοινή υπόθεση ότι πρόκειται για μια έκπληξη που δεν λειτουργούν στα Windows Forms 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