Практическое руководство. Уведомление об изменении данных с использованием метода ResetItem компонента BindingSource
Некоторые источники данных для элементов управления не инициируют уведомления об изменении при добавлении, изменении или удалении элементов. При помощи компонента BindingSource можно выполнить привязку к источникам данных и вызывать уведомление об изменениях из кода.
Пример
Эта форма демонстрирует использование компонента BindingSource для привязки списка к элементу управления DataGridView. Список не инициирует уведомления об изменениях, поэтому при изменении элемента в списке вызывается метод ResetItem из BindingSource. .
#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 );
}
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;
}
}
}
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
Компиляция кода
Для этого примера требуются:
- ссылки на сборки System, System.Data, System.Drawing и System.Windows.Forms.
См. также
.NET Desktop feedback