Porady: zapewnienie synchronizacji wiązania wielu kontrolek z jednym źródłem danych

Często podczas pracy z powiązaniem danych w formularzach Windows Forms wiele kontrolek jest powiązanych z tym samym źródłem danych. W niektórych przypadkach może być konieczne wykonanie dodatkowych kroków, aby upewnić się, że powiązane właściwości kontrolek pozostają zsynchronizowane ze sobą i ze źródłem danych. Te kroki są niezbędne w dwóch sytuacjach:

W poprzednim przypadku można użyć elementu , BindingSource aby powiązać źródło danych z kontrolkami. W tym drugim przypadku należy użyć BindingSource elementu i obsłużyć BindingComplete zdarzenie i wywołać EndCurrentEdit skojarzone BindingManagerBasepolecenie .

Przykład

W poniższym przykładzie kodu pokazano, jak powiązać trzy kontrolki — dwa kontrolki i kontrolkę DataGridView — z tą samą kolumną w elemencie używającym DataSetBindingSource składnika. W tym przykładzie pokazano, jak obsługiwać BindingComplete zdarzenie i upewnić się, że gdy wartość tekstowa jednego pola tekstowego zostanie zmieniona, dodatkowe pole tekstowe i kontrolka DataGridView zostaną zaktualizowane o poprawną wartość.

W przykładzie użyto kontrolki , BindingSource aby powiązać źródło danych i kontrolki. Alternatywnie możesz powiązać kontrolki bezpośrednio ze źródłem danych i pobrać BindingManagerBase element dla powiązania z formularza BindingContext , a następnie obsłużyć BindingComplete zdarzenie dla BindingManagerBaseelementu . Aby zapoznać się z przykładem tego, jak to zrobić, zobacz stronę Pomoc dotyczącą BindingComplete zdarzenia .BindingManagerBase


// 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 occurred.
    if (e.BindingCompleteContext ==
        BindingCompleteContext.DataSourceUpdate && e.Exception == null)

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

' Declare the controls to be used.
Private WithEvents bindingSource1 As BindingSource
Private WithEvents textBox1 As TextBox
Private WithEvents textBox2 As TextBox
Private WithEvents dataGridView1 As DataGridView


Private Sub InitializeControlsAndDataSource() 
    ' Initialize the controls and set location, size and 
    ' other basic properties.
    Me.dataGridView1 = New DataGridView()
    Me.bindingSource1 = New BindingSource()
    Me.textBox1 = New TextBox()
    Me.textBox2 = New TextBox()
    Me.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize
    Me.dataGridView1.Dock = DockStyle.Top
    Me.dataGridView1.Location = New Point(0, 0)
    Me.dataGridView1.Size = New Size(292, 150)
    Me.textBox1.Location = New Point(132, 156)
    Me.textBox1.Size = New Size(100, 20)
    Me.textBox2.Location = New Point(12, 156)
    Me.textBox2.Size = New Size(100, 20)
    Me.ClientSize = New Size(292, 266)
    Me.Controls.Add(Me.textBox2)
    Me.Controls.Add(Me.textBox1)
    Me.Controls.Add(Me.dataGridView1)
    
    ' Declare the DataSet and add a table and column.
    Dim set1 As 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)


End Sub

Private Sub bindingSource1_BindingComplete(ByVal sender As Object, _
    ByVal e As BindingCompleteEventArgs) Handles bindingSource1.BindingComplete

    ' Check if the data source has been updated, and that no error has occurred.
    If e.BindingCompleteContext = BindingCompleteContext.DataSourceUpdate _
        AndAlso e.Exception Is Nothing Then

        ' If not, end the current edit.
        e.Binding.BindingManagerBase.EndCurrentEdit()
    End If

End Sub

Kompilowanie kodu

  • Ten przykład kodu wymaga

  • Odwołania do Systemzestawów , System.Windows.Formsi System.Drawing .

  • Formularz z Load obsłużoną procedurą i wywołaniem InitializeControlsAndDataSource metody w przykładzie z procedury obsługi zdarzeń formularza Load .

Zobacz też