將多個控制項同步處理至相同的資料來源 (Windows Forms.NET)
在 Windows Forms 中實作資料繫結期間,多個控制項會繫結至相同的資料來源。 在下列情況下,必須確保控制項的繫結屬性與彼此和與資料來源保持同步:
如果資料來源未實作 IBindingList,因此會產生 ItemChanged 類型的 ListChanged 事件。
如果資料來源實作 IEditableObject。
在先前的案例中,您可以使用 BindingSource 將資料來源繫結至控制項。 在後者的情況下,您會使用 BindingSource
並處理 BindingComplete 事件,並在相關聯的 BindingManagerBase 上呼叫 EndCurrentEdit。
使用 BindingSource 繫結控制項的範例
下列程式碼範例示範如何使用 BindingSource 元件,將三個控制項、兩個文字方塊控制項和 DataGridView 控制項繫結至 DataSet 中的相同資料行。 此範例示範如何處理 BindingComplete 事件。 其可確保當某個文字方塊的文字值變更時,會以正確的值更新另一個文字方塊和 DataGridView
控制項。
此範例會使用 BindingSource 來繫結資料來源和控制項。 或者,您可以將控制項直接繫結至資料來源,並從表單的 BindingContext 擷取繫結的 BindingManagerBase,然後處理 BindingManagerBase
的 BindingComplete 事件。 如需繫結資料來源和控制項的詳細資訊,請參閱關於 BindingManagerBase
之 BindingComplete
事件的說明頁面。
public Form1()
{
InitializeComponent();
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);
}
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();
}
Public Class Form1
Private Sub InitializeControlsAndDataSource()
' Add a table and column to 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
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
InitializeControlsAndDataSource()
End Sub
End Class