星期四, 12月 27, 2018

[EF] WinForm DataBinding - Edm

該篇 [EF] WinForm DataBinding 的延伸,利用 Edm 來實作看看,Code 都是一致,比較特別的是下述這段 ObservableListSource 取代 ICollection 和 HashSet 的 MSDN 說明

找到 edm 內的該 tt 檔案,並執行文字說明的取代步驟

[EF] WinForm DataBinding-Edm-1
  • 尋找和取代出現兩次的 「ICollection"with"ObservableListSource"。 這些是位在大約行 296 和 484。
  • 尋找和取代第一個出現的 「HashSet"with"ObservableListSource"。 這項問題位於大約第 50 行。 不這麼做取代 HashSet 稍後在程式碼中找到的第二個執行個體。
取代結束後儲存,Categories 內的  ICollection 和 HashSet 就會被 ObservableListSource 取代

突發奇想測試一下,用 ICollection 透過 BindingSource 來對 DataGridView 作 DataBinding 會發生甚麼事情,結果如下圖

[EF] WinForm DataBinding-Edm-2

星期三, 12月 26, 2018

[EF] WinForm DataBinding - 手動設定 BindingSource

該篇 - [EF] WinForm DataBinding 的延伸,主要是把 BindingSource 設定,用 Code 來完成,不要用精靈來拖拉,在 bsProducts 卡關,忘記是要透過 Categories.Products 導覽屬性來找出資料,直接把 Products 塞進 bsProducts 內,造成 bsCategories 移動資料時,bsProduct 內不會作動
using System.Data.Entity;
using WinFormswithEFSample.Models;

namespace WinFormswithEFSample
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private DataBindingContext _context;

        private void Form2_Load(object sender, EventArgs e)
        {
            _context = new DataBindingContext();
            _context.Categories.Load();
            bsCategories.DataSource = _context.Categories.Local.ToBindingList();

            // bsProduct 的資料來源是 bsCategories 且 DataMember 要設定 Products Property
            bsProducts.DataSource = bsCategories;
            bsProducts.DataMember = "Products";

            dgvCategories.AutoGenerateColumns = false;
            dgvProducts.AutoGenerateColumns = false;

            bindingNavigator1.BindingSource = bsCategories;
            dgvCategories.DataSource = bsCategories;
            dgvProducts.DataSource = bsProducts;
        }
    }
}