2018年10月25日 星期四

WinForm下簡單的Binding應用 使用 Listbox 來放置資料物件

說明

本文介紹如何使用Binding的方法將讓使用者可以新增、編輯、刪減資料。

示意圖


Code

  • Binding初始化
    1. Combobox的DataSource是透過 Enum.GetValues取得,透過Linq的投影產生的List
    2. 將Combobox的SelectValue和BindingSource所繫結的類別上的屬性做繫結。要注意 SelectedValue的型別會由ComboBox的ValueMember決定。在我們的範例中,是int
    3. 同上,將Textbox上的Text值與BindingSource做繫結。
    4. 上面的兩個步驟是為了要做到 “當BindingSource所選定的項目有變化時,此變化會立刻反應到 Combobox和TextBox上。相同的,使用者在Combobox和TextBox上做的變更,也會立即反應到BindingSource目前選定的物件上”
    5. 在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);
  • 資料物件
    1. 此資料物件有實作INotifyPropertyChanged,這是為了在使用者從控制項編輯資料時,可以立即告知BindingSource 有資料異動
    2. DockValue屬性存在的原因是為了在繫結到ComboBox時,他的 ValueMember 是int,所以我們要新增一個屬性做轉型的動作
    3. 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}";
      }
    }

沒有留言:

張貼留言