[c#] 資料繫結 (Data Binding)(二) 簡單資料繫結
Introduction
延續 資料繫結 (Data Binding)(一) 簡單資料繫結,加入資料的驗證(ErrorProvider 元件 (Windows Form))與使用自定類別物件來繫結資料。
Examples
以下的 UI 介面偕相同
sample1 簡單驗證功能
當價格輸入的資料型態不是 數字時,嘗試移開輸入框時會出現驗證警告
Form1.cs
private void Form1_Load(object sender, EventArgs e) {
DataTable myTable = new DataTable("商品");
myTable.Columns.Add("品名", Type.GetType("System.String"));
myTable.Columns.Add("價格", typeof(decimal));
//建立一筆資料
myTable.Rows.Add("西瓜", 80m);
//設定資料來源
errorProvider1.DataSource = myTable;
//繫結資料
txtName.DataBindings.Add("Text", myTable, "品名", true);
Binding oBinding = new Binding("Text", myTable, "價格", true);
oBinding.FormatString = "c";
txtPrice.DataBindings.Add(oBinding);
}
輸出結果
sample2 自訂驗證
延續 sample1 的型態的驗證外,還加入一些驗證判斷
Form2.cs
private void Form2_Load(object sender, EventArgs e) {
DataTable myTable = new DataTable("商品");
myTable.Columns.Add("品名", Type.GetType("System.String"));
myTable.Columns.Add("價格", typeof(decimal));
//建立一筆資料
myTable.Rows.Add("西瓜", 80m);
//設定資料來源
errorProvider1.DataSource = myTable;
//繫結資料
txtName.DataBindings.Add("Text", myTable, "品名", true);
Binding oBinding = new Binding("Text", myTable, "價格", true);
oBinding.FormatString = "c";
txtPrice.DataBindings.Add(oBinding);
//註冊 DataColumn 改變之後事件
myTable.ColumnChanged += new DataColumnChangeEventHandler(myTable_ColumnChanged);
//註冊 正在驗證控制項 事件,這邊是為了當錯誤發生時,讓使用者無法移出控制項
txtName.Validating += new CancelEventHandler(txtName_Validating);
txtPrice.Validating += new CancelEventHandler(txtPrice_Validating);
}
void txtPrice_Validating(object sender, CancelEventArgs e) {
if (Convert.ToDecimal(((TextBox)sender).Text.Trim()) < 50) {
e.Cancel = true;
}
}
void txtName_Validating(object sender, CancelEventArgs e) {
if (((TextBox)sender).Text.Trim().Length == 0) {
e.Cancel = true;
}
}
void myTable_ColumnChanged(object sender, DataColumnChangeEventArgs e) {
if (e.Column.ColumnName.Equals("品名")) {
if (string.IsNullOrEmpty(e.ProposedValue.ToString().Trim())) {
e.Row.SetColumnError("品名", "品名不能空白");
} else {
// 將欄位的錯誤訊息重設成空字串。
e.Row.SetColumnError("品名", "");
}
} else {
if ((decimal)e.ProposedValue < 50) {
e.Row.SetColumnError("價格", "價格不能小於 50");
} else {
// 將欄位的錯誤訊息重設成空字串。
e.Row.SetColumnError("價格", string.Empty);
}
}
}
輸出結果
sample3 繫結自訂物件
Product.cs
private string _ProductName;
private decimal _Price;
public Product(string ProductName,decimal Price) {
_ProductName = ProductName;
_Price = Price;
}
public string ProductName {
get { return _ProductName; }
set {
if (string.IsNullOrEmpty(value.Trim())) {
throw new ArgumentException("品名不可空白");
} else {
_ProductName = value;
//當值改變時會呼叫事件(若使用者有繫結此事件,可以在該事件下,撰寫程式碼)
OnProductNameChanged(EventArgs.Empty);
}
}
}
public decimal Price {
get { return _Price; }
set {
if (value < 50) {
throw new ArgumentException("價格必須不可小於 50");
} else {
_Price = value;
//當值改變時會呼叫事件(若使用者有繫結此事件,可以在該事件下,撰寫程式碼)
OnPriceCnanged(EventArgs.Empty);
}
}
}
public event EventHandler ProductNameChanged;
public event EventHandler PriceChanged;
protected virtual void OnProductNameChanged(EventArgs e) {
ProductNameChanged(this, e);
}
protected virtual void OnPriceCnanged(EventArgs e) {
PriceChanged(this, e);
}
Form3.cs
private void Form3_Load(object sender, EventArgs e) {
Product oProduct = new Product("西瓜", 65);
//設定資料來源為 Product 物件。
errorProvider1.DataSource = oProduct;
txtName.DataBindings.Add("Text", oProduct, "ProductName", true);
txtPrice.DataBindings.Add("Text", oProduct, "Price", true);
}
輸出結果
三小俠 小弟獻醜,歡迎指教