You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

窗体中双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:06