星期四, 6月 15, 2023

[C#] 提供資料行已經屬於 DataGridView 控制項

要把 DataGridViewColumn 塞進 DataGridView.Columns 內時收到錯誤訊息 - [提供資料行已經屬於 DataGridView 控制項],該錯誤直覺是 DataGridView.Columns 內假如該欄位已經存在,拋出該錯誤訊息合理,但遇上情況是該 DataGridView 和 DataGridViewColumn 是反覆 new 出來,要把 DataGridViewColumn 加入 DataGridView.Columns 時拋出該錯誤

錯誤訊息

[C#] 提供資料行已經屬於 DataGridView 控制項-1

從中斷點內可以發現到 DataGridView.Columns 內目前完全沒有存在任何欄位資訊

[C#] 提供資料行已經屬於 DataGridView 控制項-2

發現 Code 在建立 DataGridViewColumn 時,因為該欄位資訊也會應用在其他地方,所以把該欄位拉出來為 private property 暫存,該 DataGridViewColumn 變成重覆加入 DataGridView 內,範例 Code 如下
private DataGridViewTextBoxColumn _col { get; set; } = new DataGridViewTextBoxColumn() { HeaderText = "文字說明", DataPropertyName = "資料來源" };

private void button1_Click(object sender, EventArgs e)
{
        var dgv1 = new DataGridView();
        dgv1.Columns.Add(_col);

        // 該 DataGridViewTextBoxColumn 重覆加入 DataGridView 內
        var dgv2 = new DataGridView();
        dgv2.Columns.Add(_col);
}
從中斷點內確認 DataGridViewColumn.DataGridView property 在把 DataGridViewColumn 加入 DataGridView 時,就會自動補上該資訊,之後該 DataGridViewColumn 再拿去加入其他 DataGridView 就會拋出 Excpetion,假如透過 DataGridView.Columns.Remove() 或 DataGridView.Columns.Clear() 清除後,該 DataGridViewColumn.DataGridView 會變成 null 就可以再次加入其他 DataGridView

中斷點內觀察 DataGridViewColumn.DataGridView property  變化,原來 property 有變化會有顏色 Highligh 顯示,之前都沒有注意到這點

[C#] 提供資料行已經屬於 DataGridView 控制項-3

基本上就是一個 DataGridViewColumn 只能加入一個 DataGridView 的意思

沒有留言:

張貼留言