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

如何在C#.NET中为DataGrid创建点击数据项跳转新页面的事件处理器

在C# .NET中实现DataGrid点击数据项打开新页面的方法

嘿,我来帮你搞定这个需求!看你贴的代码是WPF环境的,那我先重点讲WPF下的实现,顺带提下WinForms的情况,方便不同场景的朋友参考。

一、WPF环境下的实现步骤

1. 给DataGrid绑定点击事件

首先在XAML中给你的DataGrid添加点击事件,这里推荐用MouseDoubleClick(双击触发,符合大多数用户操作习惯),如果需要单击触发可以用MouseLeftButtonUp。示例代码:

<!-- 假设你的DataGrid命名为inventoryDataGrid -->
<DataGrid x:Name="inventoryDataGrid" 
          MouseDoubleClick="InventoryDataGrid_MouseDoubleClick"
          AutoGenerateColumns="True" />

2. 编写事件处理器代码

在后台代码(比如MainWindow.xaml.cs)中实现事件方法,核心逻辑是获取选中的数据行,然后打开新窗口并传递数据:

private void InventoryDataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    // 1. 获取选中的数据行(对应你DataSet里的InventoryRow类型)
    var selectedInventory = inventoryDataGrid.SelectedItem as DataSet1.InventoryRow;
    
    // 2. 校验是否选中了有效数据,避免空指针
    if (selectedInventory == null) return;

    // 3. 创建并打开新窗口
    // 假设你已经提前创建了一个用来展示详情的窗口DetailWindow
    var detailWindow = new DetailWindow();
    
    // 4. 把选中的数据传递给新窗口(这里用属性传递,也可以直接通过构造函数传入)
    detailWindow.SelectedInventoryId = selectedInventory.Id; // 假设Id是你的表主键字段
    
    // 5. 打开窗口:Show()是非模态(可同时操作原窗口),ShowDialog()是模态(必须关闭新窗口才能操作原窗口)
    detailWindow.Show();
}

3. 进阶:精准触发(只响应数据行点击)

如果需要确保只有点击数据内容时才触发(排除表头、空白区域的误触),可以添加一个辅助方法来判断点击元素是否属于DataGridRow:

// 先写一个通用的UI辅助类,用来查找父控件
public static class UIHelper
{
    public static T FindParent<T>(DependencyObject child) where T : DependencyObject
    {
        DependencyObject parentObject = VisualTreeHelper.GetParent(child);
        if (parentObject == null) return null;
        
        if (parentObject is T parent)
            return parent;
        else
            return FindParent<T>(parentObject);
    }
}

// 修改后的事件处理器
private void InventoryDataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    // 找到点击元素所在的DataGridRow
    var clickedRow = UIHelper.FindParent<DataGridRow>(e.OriginalSource as DependencyObject);
    
    // 校验是否点击了有效数据行
    if (clickedRow == null || clickedRow.Item == null) return;
    
    // 转换为你的数据行类型
    var selectedInventory = clickedRow.Item as DataSet1.InventoryRow;
    if (selectedInventory == null) return;
    
    // 后续打开新窗口的逻辑和之前一致
    var detailWindow = new DetailWindow();
    detailWindow.SelectedInventoryId = selectedInventory.Id;
    detailWindow.Show();
}

二、WinForms环境下的实现(额外补充)

如果是WinForms的DataGridView,实现逻辑类似,使用CellClick事件即可:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // 排除表头行(e.RowIndex为-1时代表点击了表头)
    if (e.RowIndex < 0) return;
    
    // 获取选中行的绑定数据
    DataGridViewRow selectedRow = dataGridView1.Rows[e.RowIndex];
    DataRowView rowData = selectedRow.DataBoundItem as DataRowView;
    
    if (rowData == null) return;
    
    // 打开新窗体
    DetailForm detailForm = new DetailForm();
    // 传递数据,这里用自定义属性传递,也可以用Tag属性
    detailForm.InventoryId = Convert.ToInt32(rowData.Row["Id"]);
    detailForm.Show();
}

几个关键注意点

  • 数据源绑定检查:确保你的DataGrid已经正确绑定了数据源(像你代码里用OracleDataAdapter填充DataSet的部分,要保证数据成功加载到控件中)。
  • 数据传递方式:优先用构造函数或公共属性传递数据,避免使用静态变量,这样代码更清晰、易维护。
  • 窗口打开模式:根据业务需求选择Show()或ShowDialog(),模态窗口适合需要用户先处理完新页面再返回原页面的场景。

内容的提问来源于stack exchange,提问作者coolarshad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:28:50