[c#] 資料繫結 (Data Binding)(二) 簡單資料繫結與 ErrorProvider

  • 9830
  • 0

[c#] 資料繫結 (Data Binding)(二) 簡單資料繫結

Introduction

延續 資料繫結 (Data Binding)(一) 簡單資料繫結,加入資料的驗證(ErrorProvider 元件 (Windows Form))與使用自定類別物件來繫結資料。

 

Examples

以下的 UI 介面偕相同

2010-01-30_132445

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);
        }

 

 

輸出結果

2010-01-30_133035

 

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);
                }
            }            
        }

 

輸出結果

2010-01-30_133618

 

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);           
        }

 

輸出結果

2010-01-30_134110

 

程式碼下載TestErrorProvider.rar

三小俠  小弟獻醜,歡迎指教