Gewusst wie: Sicherstellen, dass mehrere Steuerelemente, die an die gleiche Datenquelle gebunden sind, synchronisiert bleiben

Aktualisiert: November 2007

Beim Arbeiten mit Datenbindungen in Windows Forms werden häufig mehrere Steuerelemente an die gleiche Datenquelle gebunden. In manchen Fällen müssen Sie unter Umständen anhand zusätzlicher Schritte sicherstellen, dass die gebundenen Eigenschaften der Steuerelemente untereinander und mit der Datenquelle synchronisiert bleiben. Diese Schritte sind in zwei Situationen notwendig:

Im ersten Fall können Sie eine BindingSource-Komponente verwenden, um die Datenquelle an die Steuerelemente zu binden. In letzterem Fall verwenden Sie eine BindingSource-Komponente, behandeln das BindingComplete-Ereignis und rufen EndCurrentEdit auf der zugeordneten BindingManagerBase auf.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie drei Steuerelemente (zwei Textfeldsteuerelemente und ein DataGridView-Steuerelement) mithilfe einer BindingSource-Komponente an die gleiche Spalte in einem DataSet binden können. In diesem Beispiel wird beschrieben, wie Sie das BindingComplete-Ereignis behandeln müssen und wie Sie sicherstellen können, dass bei Änderungen am Textwert eines Textfelds das zusätzliche Textfeld und das DataGridView-Steuerelement mit dem richtigen Wert aktualisiert werden.

Im Beispiel wird eine BindingSource-Komponente verwendet, um die Datenquelle und die Steuerelemente zu binden. Optional können Sie die Steuerelemente direkt an die Datenquelle binden und die BindingManagerBase für die Bindung aus der BindingContext-Eigenschaft des Formulars abrufen und dann das BindingComplete-Ereignis für die BindingManagerBase behandeln. Auf der Hilfeseite über das BindingComplete-Ereignis von BindingManagerBase finden Sie ein Beispiel zu dieser Vorgehensweise.


// Declare the controls to be used.
private BindingSource bindingSource1;
private TextBox textBox1;
private TextBox textBox2;
private DataGridView dataGridView1;

private void InitializeControlsAndDataSource()
{
    // Initialize the controls and set location, size and 
    // other basic properties.
    this.dataGridView1 = new DataGridView();
    this.bindingSource1 = new BindingSource();
    this.textBox1 = new TextBox();
    this.textBox2 = new TextBox();
    this.dataGridView1.ColumnHeadersHeightSizeMode =
        DataGridViewColumnHeadersHeightSizeMode.AutoSize;
    this.dataGridView1.Dock = DockStyle.Top;
    this.dataGridView1.Location = new Point(0, 0);
    this.dataGridView1.Size = new Size(292, 150);
    this.textBox1.Location = new Point(132, 156);
    this.textBox1.Size = new Size(100, 20);
    this.textBox2.Location = new Point(12, 156);
    this.textBox2.Size = new Size(100, 20);
    this.ClientSize = new Size(292, 266);
    this.Controls.Add(this.textBox2);
    this.Controls.Add(this.textBox1);
    this.Controls.Add(this.dataGridView1);

    // Declare the DataSet and add a table and column.
    DataSet set1 = new DataSet();
    set1.Tables.Add("Menu");
    set1.Tables[0].Columns.Add("Beverages");

    // Add some rows to the table.
    set1.Tables[0].Rows.Add("coffee");
    set1.Tables[0].Rows.Add("tea");
    set1.Tables[0].Rows.Add("hot chocolate");
    set1.Tables[0].Rows.Add("milk");
    set1.Tables[0].Rows.Add("orange juice");

    // Set the data source to the DataSet.
    bindingSource1.DataSource = set1;

    //Set the DataMember to the Menu table.
    bindingSource1.DataMember = "Menu";

    // Add the control data bindings.
    dataGridView1.DataSource = bindingSource1;
    textBox1.DataBindings.Add("Text", bindingSource1, 
        "Beverages", true, DataSourceUpdateMode.OnPropertyChanged);
    textBox2.DataBindings.Add("Text", bindingSource1, 
        "Beverages", true, DataSourceUpdateMode.OnPropertyChanged);
    bindingSource1.BindingComplete += 
        new BindingCompleteEventHandler(bindingSource1_BindingComplete);
}

private void bindingSource1_BindingComplete(object sender, BindingCompleteEventArgs e)
{
    // Check if the data source has been updated, and that no error has occured.
    if (e.BindingCompleteContext == 
        BindingCompleteContext.DataSourceUpdate && e.Exception == null)

        // If not, end the current edit.
        e.Binding.BindingManagerBase.EndCurrentEdit();
}



  • Für dieses Codebeispiel wird Folgendes benötigt:

  • Verweise auf die Assemblys System, System.Windows.Forms und System.Drawing

  • Ein Formular mit dem behandelten Load-Ereignis und ein Aufruf der InitializeControlsAndDataSource-Methode im Beispiel für den Load-Ereignishandler des Formulars.

Community-Beiträge

Anzeigen: