窗体中双GridControl联动需求及C# DataGridView代码咨询
嘿,我来帮你把原来DataGridView的联动逻辑适配到DevExpress的GridControl上,完美实现点击GridControl1行时,GridControl2自动显示对应人员任务的需求~
核心思路
和你原来的DataGridView逻辑类似:获取GridControl1选中行的人员标识(比如KisiNo),然后给GridControl2的数据源设置过滤条件,或者重新绑定该人员的专属任务数据。不过DevExpress的GridControl有自己的API,咱们直接上实用代码:
方案1:使用内置过滤(适合数据源已加载所有任务的情况)
这种方式不需要重新查询数据库,直接在已加载的任务数据里过滤,响应更快。我们用FocusedRowChanged事件(比CellClick更靠谱,因为点击行任意位置或通过键盘切换行都会触发):
private void gridControl1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { // 获取GridControl1对应的GridView实例 GridView gridView1 = gridControl1.MainView as GridView; if (gridView1 == null || gridView1.FocusedRowHandle == DevExpress.XtraGrid.GridControl.InvalidRowHandle) { // 如果没有选中行,清空GridControl2的过滤 GridView gridView2 = gridControl2.MainView as GridView; if (gridView2 != null) gridView2.ActiveFilterString = ""; return; } // 获取选中行的KisiNo值,分两种数据源情况: // 情况A:强类型数据源(比如绑定了List<Contact>) Contact selectedContact = gridView1.GetRow(gridView1.FocusedRowHandle) as Contact; if (selectedContact == null) return; int targetKisiNo = selectedContact.KisiNo; // 情况B:弱类型数据源(比如DataTable) // DataRowView selectedRow = gridView1.GetRow(gridView1.FocusedRowHandle) as DataRowView; // if (selectedRow == null) return; // int targetKisiNo = Convert.ToInt32(selectedRow["KisiNo"]); // 给GridControl2设置过滤条件 GridView gridView2 = gridControl2.MainView as GridView; if (gridView2 != null) { // DevExpress的过滤语法和DataTable的RowFilter类似,直接写条件即可 gridView2.ActiveFilterString = $"KisiNo = {targetKisiNo}"; } }
方案2:重新查询数据库(适合数据量极大的场景)
如果任务数据量非常大,提前加载所有数据会占用过多内存,那可以在选中行后实时查询该人员的任务,再绑定到GridControl2:
private void gridControl1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { GridView gridView1 = gridControl1.MainView as GridView; if (gridView1 == null || gridView1.FocusedRowHandle == DevExpress.XtraGrid.GridControl.InvalidRowHandle) { gridControl2.DataSource = null; // 清空GridControl2 return; } // 获取选中行的KisiNo int targetKisiNo = Convert.ToInt32(gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "KisiNo")); // 调用你的数据查询方法,获取该人员的任务 List<Task> userTasks = FetchUserTasksFromDb(targetKisiNo); gridControl2.DataSource = userTasks; } // 模拟数据库查询方法,你可以替换成自己的EF/ADO.NET逻辑 private List<Task> FetchUserTasksFromDb(int kisiNo) { using (var dbContext = new YourDatabaseContext()) { return dbContext.Tasks.Where(task => task.KisiNo == kisiNo).ToList(); } }
注意事项
- 要确保两个GridControl都已经正确绑定了初始数据源(GridControl1绑定联系人列表,GridControl2绑定全量任务列表或初始为空)。
- 记得在设计器里给GridControl1的**MainView(也就是GridView1)**绑定
FocusedRowChanged事件,或者在代码里手动注册:// 窗体构造函数里添加 gridView1.FocusedRowChanged += gridControl1_FocusedRowChanged;
内容的提问来源于stack exchange,提问作者Burak Turhan
相关产品推荐
相关产品推荐

