說明
本文介紹如何使用Binding的方法將讓使用者可以新增、編輯、刪減資料。
示意圖
Code
- Binding初始化
- Combobox的DataSource是透過 Enum.GetValues取得,透過Linq的投影產生的List
- 將Combobox的SelectValue和BindingSource所繫結的類別上的屬性做繫結。要注意 SelectedValue的型別會由ComboBox的ValueMember決定。在我們的範例中,是int
- 同上,將Textbox上的Text值與BindingSource做繫結。
- 上面的兩個步驟是為了要做到 “當BindingSource所選定的項目有變化時,此變化會立刻反應到 Combobox和TextBox上。相同的,使用者在Combobox和TextBox上做的變更,也會立即反應到BindingSource目前選定的物件上”
- 在DataBingings的,可以發現都加上 DataSourceUpdateMode.OnPropertyChanged。這是代表當使用者在Textbox上做了變更時,會立即反應到資料上,而不是等到焦點移開時(Invalidate)
_Bs.DataSource = typeof(Test);
//Combobox所使用的列舉
var items = Enum.GetValues(typeof(DockStyle)).OfType().Select()
comboBox1.ValueMember = "Item1";
comboBox1.DisplayMember = "Item2";
comboBox1.DataSource = items;
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
//將資料與Listbox Binding
listBox1.DataSource = _Bs;
//將combobox的SeletedValue屬性與BindingSource內所選擇的物件Binding
comboBox1.DataBindings.Add(nameof(ComboBox.SelectedValue), _Bs, nameof(Test.DockValue),false, DataSourceUpdateMode.OnPropertyChanged );
//將textbox的Text屬性與BindingSource內所選擇的物件Binding
textBox1.DataBindings.Add(nameof(TextBox.Text), _Bs, nameof(Test.DisplayName), false, DataSourceUpdateMode.OnPropertyChanged);
- 資料物件
- 此資料物件有實作INotifyPropertyChanged,這是為了在使用者從控制項編輯資料時,可以立即告知BindingSource 有資料異動
- DockValue屬性存在的原因是為了在繫結到ComboBox時,他的 ValueMember 是int,所以我們要新增一個屬性做轉型的動作
- ToString被複寫了,因為將此資料呈現在ListBox上時,預設ListBox會將資料做ToString()取得描述值
internal class Test: INotifyPropertyChanged
{
#region INotifyPropertyChanged
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string strName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(strName));
}
#endregion
DockStyle _Dock = DockStyle.None;
public DockStyle Dock
{
get { return _Dock; }
set
{
if (_Dock != value)
{
_Dock = value;
OnPropertyChanged();
}
}
}
public int DockValue
{
get { return (int) Dock; }
set
{
if ((int)Dock != value)
{
Dock =(DockStyle) value;
OnPropertyChanged();
}
}
}
string _DisplayName = string.Empty;
public string DisplayName
{
get { return _DisplayName; }
set
{
if (_DisplayName != value)
{
_DisplayName = value;
OnPropertyChanged();
}
}
}
public override string ToString()
{
return $"{Dock} - {DisplayName}";
}
}