Практическое руководство. Уведомление об изменении данных с использованием метода ResetItem компонента BindingSource

Обновлен: Ноябрь 2007

Некоторые источники данных для элементов управления не инициируют уведомления об изменении в случае изменения, добавления или удаления элементов управления. Компонент BindingSource обеспечивает возможность привязки к таким источникам данных и инициирования уведомления об изменении из кода.

Пример

Эта форма демонстрирует использование компонента BindingSource для привязки списка к элементу управления DataGridView. Список не инициирует уведомления об изменениях, поэтому метод ResetItemBindingSource вызывается при изменении элемента в списке. .

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Drawing
Imports System.Windows.Forms

' This form demonstrates using a BindingSource to bind
' a list to a DataGridView control. The list does not
' raise change notifications, so the ResetItem method 
' on the BindingSource is used.
Public Class Form1
    Inherits System.Windows.Forms.Form

    ' This button causes the value of a list element to be changed.
    Private WithEvents changeItemBtn As New Button()

    ' This is the DataGridView control that displays the contents 
    ' of the list.
    Private customersDataGridView As New DataGridView()

    ' This is the BindingSource used to bind the list to the 
    ' DataGridView control.
    Private WithEvents customersBindingSource As New BindingSource()

    Public Sub New()
        ' Set up the "Change Item" button.
        Me.changeItemBtn.Text = "Change Item"
        Me.changeItemBtn.Dock = DockStyle.Bottom
        Me.Controls.Add(Me.changeItemBtn)

        ' Set up the DataGridView.
        customersDataGridView.Dock = DockStyle.Top
        Me.Controls.Add(customersDataGridView)
        Me.Size = New Size(800, 200)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Me.Load
        ' Create and populate the list of DemoCustomer objects
        ' which will supply data to the DataGridView.
        Dim customerList As List(Of DemoCustomer) = _
        New List(Of DemoCustomer)
        customerList.Add(DemoCustomer.CreateNewCustomer())
        customerList.Add(DemoCustomer.CreateNewCustomer())
        customerList.Add(DemoCustomer.CreateNewCustomer())

        ' Bind the list to the BindingSource.
        Me.customersBindingSource.DataSource = customerList

        ' Attach the BindingSource to the DataGridView.
        Me.customersDataGridView.DataSource = Me.customersBindingSource
    End Sub

    ' This event handler changes the value of the CompanyName
    ' property for the first item in the list.
    Private Sub changeItemBtn_Click(ByVal sender As Object, ByVal e As EventArgs) _
       Handles changeItemBtn.Click

        ' Get a reference to the list from the BindingSource.
        Dim customerList As List(Of DemoCustomer) = _
        CType(Me.customersBindingSource.DataSource, List(Of DemoCustomer))

        ' Change the value of the CompanyName property for the 
        ' first item in the list.
        customerList(0).CompanyName = "Tailspin Toys"

        ' Call ResetItem to alert the BindingSource that the 
        ' list has changed.
        Me.customersBindingSource.ResetItem(0)

    End Sub

    <STAThread()> _
    Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New Form1())
    End Sub
End Class

' This class implements a simple customer type.
Public Class DemoCustomer

    ' These fields hold the values for the public properties.
    Private idValue As Guid = Guid.NewGuid()
    Private customerName As String = String.Empty
    Private companyNameValue As String = String.Empty
    Private phoneNumberValue As String = String.Empty

    ' The constructor is private to enforce the factory pattern.
    Private Sub New()
        customerName = "no data"
        companyNameValue = "no data"
        phoneNumberValue = "no data"
    End Sub

    ' This is the public factory method.
    Public Shared Function CreateNewCustomer() As DemoCustomer
        Return New DemoCustomer()
    End Function

    ' This property represents an ID, suitable
    ' for use as a primary key in a database.
    Public ReadOnly Property ID() As Guid
        Get
            Return Me.idValue
        End Get
    End Property

    Public Property CompanyName() As String
        Get
            Return Me.companyNameValue
        End Get

        Set(ByVal value As String)
            Me.companyNameValue = Value
        End Set
    End Property


    Public Property PhoneNumber() As String
        Get
            Return Me.phoneNumberValue
        End Get

        Set(ByVal value As String)
            Me.phoneNumberValue = Value
        End Set
    End Property
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Diagnostics;
using System.Drawing;
using System.Data.SqlClient;
using System.Windows.Forms;

// This form demonstrates using a BindingSource to bind
// a list to a DataGridView control. The list does not
// raise change notifications, so the ResetItem method 
// on the BindingSource is used.
public class Form1 : System.Windows.Forms.Form
{
    // This button causes the value of a list element to be changed.
    private Button changeItemBtn = new Button();

    // This is the DataGridView control that displays the contents 
    // of the list.
    private DataGridView customersDataGridView = new DataGridView();

    // This is the BindingSource used to bind the list to the 
    // DataGridView control.
    private BindingSource customersBindingSource = new BindingSource();

    public Form1()
    {
        // Set up the "Change Item" button.
        this.changeItemBtn.Text = "Change Item";
        this.changeItemBtn.Dock = DockStyle.Bottom;
        this.changeItemBtn.Click += 
            new EventHandler(changeItemBtn_Click);
        this.Controls.Add(this.changeItemBtn);

        // Set up the DataGridView.
        customersDataGridView.Dock = DockStyle.Top;
        this.Controls.Add(customersDataGridView);
        this.Size = new Size(800, 200);
        this.Load += new EventHandler(Form1_Load);
    }

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Create and populate the list of DemoCustomer objects
        // which will supply data to the DataGridView.
        List<DemoCustomer> customerList = new List<DemoCustomer>();
        customerList.Add(DemoCustomer.CreateNewCustomer());
        customerList.Add(DemoCustomer.CreateNewCustomer());
        customerList.Add(DemoCustomer.CreateNewCustomer());

        // Bind the list to the BindingSource.
        this.customersBindingSource.DataSource = customerList;


        // Attach the BindingSource to the DataGridView.
        this.customersDataGridView.DataSource = 
            this.customersBindingSource;
    }

    // This event handler changes the value of the CompanyName
    // property for the first item in the list.
    void changeItemBtn_Click(object sender, EventArgs e)
    {
        // Get a reference to the list from the BindingSource.
        List<DemoCustomer> customerList = 
            this.customersBindingSource.DataSource as List<DemoCustomer>;

        // Change the value of the CompanyName property for the 
        // first item in the list.
        customerList[0].CompanyName = "Tailspin Toys";

        // Call ResetItem to alert the BindingSource that the 
        // list has changed.
        this.customersBindingSource.ResetItem(0);
    }


    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }
}

// This class implements a simple customer type.
public class DemoCustomer
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerName = String.Empty;
    private string companyNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerName = "no data";
        companyNameValue = "no data";
        phoneNumberValue = "no data";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CompanyName
    {
        get
        {
            return this.companyNameValue;
        }

        set
        {
            this.companyNameValue = value;
        }
    }

    public string PhoneNumber
    {
        get
        {
            return this.phoneNumberValue;
        }

        set
        {
            this.phoneNumberValue = value;
        }
    }
}
#using <System.dll>
#using <System.Data.dll>
#using <System.Drawing.dll>
#using <System.EnterpriseServices.dll>
#using <System.Transactions.dll>
#using <System.Windows.Forms.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Collections::Generic;
using namespace System::ComponentModel;
using namespace System::Data;
using namespace System::Data::Common;
using namespace System::Data::SqlClient;
using namespace System::Diagnostics;
using namespace System::Drawing;
using namespace System::Windows::Forms;

// This class implements a simple customer type.
public ref class DemoCustomer
{
private:
   // These fields hold the values for the public properties.
   Guid idValue;
   String^ customerName;
   String^ companyNameValue;
   String^ phoneNumberValue;

   // The constructor is private to enforce the factory pattern.
   DemoCustomer()
   {
      idValue = Guid::NewGuid();
      customerName = L"no data";
      companyNameValue = L"no data";
      phoneNumberValue = L"no data";
   }

public:
   // This is the public factory method.
   static DemoCustomer^ CreateNewCustomer()
   {
      return gcnew DemoCustomer;
   }

   property Guid ID 
   {
      // This property represents an ID, suitable
      // for use as a primary key in a database.
      Guid get()
      {
         return this->idValue;
      }
   }

   property String^ CompanyName 
   {
      String^ get()
      {
         return this->companyNameValue;
      }

      void set( String^ value )
      {
         this->companyNameValue = value;
      }
   }

   property String^ PhoneNumber 
   {
      String^ get()
      {
         return this->phoneNumberValue;
      }

      void set( String^ value )
      {
         this->phoneNumberValue = value;
      }
   }
};

// This form demonstrates using a BindingSource to bind
// a list to a DataGridView control. The list does not
// raise change notifications, so the ResetItem method
// on the BindingSource is used.
public ref class Form1: public System::Windows::Forms::Form
{
private:
   // This button causes the value of a list element to be changed.
   Button^ changeItemBtn;

   // This is the DataGridView control that displays the contents
   // of the list.
   DataGridView^ customersDataGridView;

   // This is the BindingSource used to bind the list to the
   // DataGridView control.
   BindingSource^ customersBindingSource;

public:
   Form1()
   {
      changeItemBtn = gcnew Button;
      customersDataGridView = gcnew DataGridView;
      customersBindingSource = gcnew BindingSource;

      // Set up the "Change Item" button.
            this->changeItemBtn->Text = L"Change Item";
      this->changeItemBtn->Dock = DockStyle::Bottom;
      this->changeItemBtn->Click += gcnew EventHandler(
         this, &Form1::changeItemBtn_Click );
      this->Controls->Add( this->changeItemBtn );

      // Set up the DataGridView.
      customersDataGridView->Dock = DockStyle::Top;
      this->Controls->Add( customersDataGridView );
      this->Size = System::Drawing::Size( 800, 200 );
      this->Load += gcnew EventHandler( this, &Form1::Form1_Load );
   }

private:
   void Form1_Load( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      // Create and populate the list of DemoCustomer objects
      // which will supply data to the DataGridView.
      List< DemoCustomer^ >^ customerList = gcnew List< DemoCustomer^ >;
      customerList->Add( DemoCustomer::CreateNewCustomer() );
      customerList->Add( DemoCustomer::CreateNewCustomer() );
      customerList->Add( DemoCustomer::CreateNewCustomer() );

      // Bind the list to the BindingSource.
      this->customersBindingSource->DataSource = customerList;

      // Attach the BindingSource to the DataGridView.
      this->customersDataGridView->DataSource =
         this->customersBindingSource;
   }

   // This event handler changes the value of the CompanyName
   // property for the first item in the list.
   void changeItemBtn_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      // Get a reference to the list from the BindingSource.
      List< DemoCustomer^ >^ customerList =
         static_cast<List< DemoCustomer^ >^>(
           this->customersBindingSource->DataSource);

      // Change the value of the CompanyName property for the
      // first item in the list.
      customerList->default[ 0 ]->CompanyName = L"Tailspin Toys";

      // Call ResetItem to alert the BindingSource that the
      // list has changed.
      this->customersBindingSource->ResetItem( 0 );
   }
};

int main()
{
   Application::EnableVisualStyles();
   Application::Run( gcnew Form1 );
}
import System.*;
import System.Collections.Generic.*;
import System.ComponentModel.*;
import System.Data.*;
import System.Data.Common.*;
import System.Diagnostics.*;
import System.Drawing.*;
import System.Data.SqlClient.*;
import System.Windows.Forms.*;

// This form demonstrates using a BindingSource to bind
// a list to a DataGridView control. The list does not
// raise change notifications, so the ResetItem method 
// on the BindingSource is used.
public class Form1 extends System.Windows.Forms.Form
{
    // This button causes the value of a list element to be changed.
    private Button changeItemBtn = new Button();

    // This is the DataGridView control that displays the contents 
    // of the list.
    private DataGridView customersDataGridView = new DataGridView();

    // This is the BindingSource used to bind the list to the 
    // DataGridView control.
    private BindingSource customersBindingSource = new BindingSource();

    public Form1()
    {
        // Set up the "Change Item" button.
        this.changeItemBtn.set_Text("Change Item");
        this.changeItemBtn.set_Dock(DockStyle.Bottom);
        this.changeItemBtn.add_Click(new EventHandler(changeItemBtn_Click));
        this.get_Controls().Add(this.changeItemBtn);
        // Set up the DataGridView.
        customersDataGridView.set_Dock(DockStyle.Top);
        this.get_Controls().Add(customersDataGridView);
        this.set_Size(new Size(800, 200));
        this.add_Load(new EventHandler(Form1_Load));
    } //Form1

    private void Form1_Load(Object sender, EventArgs e)
    {
        // Create and populate the list of DemoCustomer objects
        // which will supply data to the DataGridView.
        List<DemoCustomer> customerList = new List<DemoCustomer>();
        customerList.Add(DemoCustomer.CreateNewCustomer());
        customerList.Add(DemoCustomer.CreateNewCustomer());
        customerList.Add(DemoCustomer.CreateNewCustomer());
        // Bind the list to the BindingSource.
        this.customersBindingSource.set_DataSource(customerList);
        // Handle the ListChanged event.
        this.customersBindingSource.add_ListChanged(
            new ListChangedEventHandler(customersBindingSource_ListChanged));
        // Attach the BindingSource to the DataGridView.
        this.customersDataGridView.set_DataSource(this.customersBindingSource);
    } //Form1_Load

    // This event handler changes the value of the CompanyName
    // property for the first item in the list.
    private void changeItemBtn_Click(Object sender, EventArgs e)
    {
        // Get a reference to the list from the BindingSource.
        List<DemoCustomer> customerList = (List<DemoCustomer>)this.
            customersBindingSource.get_DataSource();
        // Change the value of the CompanyName property for the 
        // first item in the list.
        customerList.get_Item(0).set_CompanyName("Tailspin Toys");
        // Call ResetItem to alert the BindingSource that the 
        // list has changed.
        this.customersBindingSource.ResetItem(0);
    } //changeItemBtn_Click

    // This event handler asserts that the change to the list
    // backing the BindingSource is of type ItemChanged.
    private void customersBindingSource_ListChanged(Object sender, ListChangedEventArgs e)
    {
        Trace.Assert(e.get_ListChangedType() == ListChangedType.ItemChanged);
    } //customersBindingSource_ListChanged

    /** @attribute STAThread()
     */
    public static void main(String[] args)
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    } //main
} //Form1

// This class implements a simple customer type.
public class DemoCustomer
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();

    private String customerName = "";
    private String companyNameValue = "";
    private String phoneNumberValue = "";

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerName = "no data";
        companyNameValue = "no data";
        phoneNumberValue = "no data";
    } //DemoCustomer

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    } //CreateNewCustomer

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    /** @property 
     */
    public Guid get_ID()
    {
        return this.idValue;
    }//get_ID

    /** @property 
     */
    public String get_CompanyName()
    {
        return this.companyNameValue;
    }//get_CompanyName

    /** @property 
     */
    public void set_CompanyName(String value)
    {
        this.companyNameValue = value;
    }//set_CompanyName

    /** @property 
     */
    public String get_PhoneNumber()
    {
        return this.phoneNumberValue;
    }//get_PhoneNumber

    /** @property 
     */
    public void set_PhoneNumber(String value)
    {
        this.phoneNumberValue = value;
    }//set_PhoneNumber
} //DemoCustomer

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

Для этого примера необходимо следующее:

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

Дополнительные сведения о построении этого примера из командной строки для Visual Basic или Visual C# см. в разделе Построение из командной строки (Visual Basic) или Построение из командной строки с помощью csc.exe. Можно также построить этот пример в Visual Studio путем вставки кода в новый проект. Дополнительные сведения см. в разделах Практическое руководство. Компиляция и выполнение откомпилированного примера кода формы Windows Forms с помощью Visual Studio и Практическое руководство. Компиляция и выполнение откомпилированного примера кода формы Windows Forms с помощью Visual Studio и Практическое руководство. Компиляция и выполнение откомпилированного примера кода формы Windows Forms с помощью Visual Studio.

См. также

Задачи

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

Ссылки

BindingNavigator

DataGridView

BindingSource

Другие ресурсы

Компонент BindingSource