Show / Hide Table of Contents

Практическое руководство. Синхронизация элементов управления, связанных с одним источником данных

Иногда при работе с привязкой данных в Windows Forms, несколько элементов управления привязаны к тому же источнику данных. В некоторых случаях может потребоваться выполнить дополнительные шаги, чтобы убедиться, что привязанного свойства элементов управления будут синхронизированы друг с другом и источником данных. Эти шаги необходимы в двух случаях:

  • Если источник данных не реализует IBindingListи поэтому вызывает ListChanged события типа ItemChanged.

  • Если источник данных реализует IEditableObject.

В первом случае можно использовать BindingSource для привязки источника данных к элементам управления. В последнем случае используется BindingSource и обрабатывать BindingComplete событий и вызовов EndCurrentEdit в связанном BindingManagerBase.

Пример

В следующем примере кода показано, как привязать три элемента управления — два элемента управления текстового поля и DataGridView элемента управления, в том же столбце в DataSet с помощью BindingSource компонента. В этом примере показано, как обрабатывать BindingComplete событий и убедитесь, что при изменении текстовое значение первого поля, текстового поля и DataGridView обновление элемента управления с правильным значением.

В примере используется BindingSource для привязки источника данных и элементов управления. Кроме того, можно привязать элементы управления непосредственно к источнику данных и извлечь BindingManagerBase для привязки из формы BindingContext и затем обработать BindingComplete событие для BindingManagerBase. Например, как это сделать, см. на странице справки BindingComplete событие 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 occured.
        if (e.BindingCompleteContext == 
            BindingCompleteContext.DataSourceUpdate && e.Exception == null)

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

Компиляция кода

  • Данный пример кода требует

  • ссылки на сборки System, System.Windows.Forms и System.Drawing.

  • Форма с Load событие как обработанное и вызов InitializeControlsAndDataSource метод в примере из формы Load обработчик событий.

См. также

  • Практическое руководство. Совместное использование одних и тех же данных в нескольких формах посредством компонента BindingSource
  • Получение уведомления об изменении данных, связанных с элементом управления, в Windows Forms
  • Интерфейсы, относящиеся к привязке данных
  • Привязка данных Windows Forms
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX