首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# DataGridView 數據同步:兩表聯動顯示的數據源綁定策略

     編輯:程式設計綜合問答

需求

用戶在 dataGridView1 輸入/編輯數據後,dataGridView2 實時顯示相同數據(或經過轉換的視圖)。

核心方案:共享同一數據源對象

DataGridView 的 DataSource 屬性接受任何實現 IList/IBindingList 的對象。**讓兩個 Grid 綁定同一個 BindingList<T> 或 DataTable 實例**,即可實現零代碼同步。

實現示例

// 1. 定義實體類
public class RowData {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Amount { get; set; }
}

// 2. 窗體構造/載入時初始化共享數據源
private BindingList sharedSource = new BindingList();

private void Form1_Load(object sender, EventArgs e) {
    // 測試數據
    sharedSource.Add(new RowData { Id = 1, Name = "項目A", Amount = 100 });
    
    // 關鍵:兩個 Grid 綁定同一個對象
    dataGridView1.DataSource = sharedSource;
    dataGridView2.DataSource = sharedSource;
    
    // 可選:針對 Grid2 只顯示特定列
    dataGridView2.AutoGenerateColumns = false;
    dataGridView2.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Name", HeaderText = "名稱" });
    dataGridView2.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Amount", HeaderText = "金額" });
}

進階:若 Grid2 需不同視圖(如匯總、過濾)

  • DataView:DataTable 為源時,創建 DataView dv = table.DefaultView; dv.RowFilter = "Amount > 100"; grid2.DataSource = dv; — 仍共享底層數據,修改雙向同步。
  • BindingSource:作為中介層,bs1.DataSource = sharedList; bs2.DataSource = sharedList; grid1.DataSource = bs1; grid2.DataSource = bs2; — 可獨立排序/過濾/當前行,不影響彼此,但數據修改仍同步。

常見誤區

  1. 重新 new List():grid2.DataSource = new List(sharedSource); 會斷開引用,修改不同步。
  2. 只綁定列不綁定源:手動 Rows.Add() 而不設置 DataSource,無法利用數據綁定機制。
  3. 忽略 INotifyPropertyChanged:實體屬性變更需通知 UI,否則編輯後 Grid 不刷新(BindingList 已內置項增刪通知,屬性級需自行實現)。

總結

**「單一數據源、多視圖綁定」** 是 WinForms 數據同步的核心模式。共享 BindingList<T> 或 DataTable,配合 BindingSource 實現視圖級差異,即可輕鬆實現多 Grid 聯動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved