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

C# DevExpress:聚焦行转自定义对象时出现空引用异常

嘿,我来帮你排查这个空引用异常的问题,看你的代码和需求,大概踩了几个常见的小坑,咱们一步步来解决:

首先,先揪出代码里的低级错误

你声明的对象是Person p,但弹窗里用的是person.Name——这变量名大小写/拼写不一致啊!先把这个改过来,不然编译都通不过,更别说运行了。

核心问题:GetFocusedRow()返回null的原因及解决

空引用异常本质是gridView.GetFocusedRow()没拿到有效对象,一般有两种情况:

情况1:用户根本没选中任何行就点了按钮

这时候GetFocusedRow()自然返回null,所以必须先加个空判断,避免程序崩溃:

private void btn_Get_Object_Details_Click(object sender, EventArgs e) 
{
    Person p = gridView.GetFocusedRow() as Person;
    if (p != null) // 先确认拿到了有效对象
    {
        MessageBox.Show("name: " + p.Name);
        // 这里打开新窗体并传递对象
        var detailForm = new YourDetailForm();
        detailForm.SelectedPerson = p; // 假设你的新窗体有这个属性
        detailForm.Show();
    }
    else
    {
        MessageBox.Show("请先选中一行数据再操作哦!");
    }
}

情况2:GridView的数据源不是Person实体集合

你是用SELECT *从SQL查数据,默认绑定的大概率是DataTable或DataRowView,而不是Person类对象。这时候用as Person强制转换肯定会失败,返回null。

解决办法分两种:

方案A:把SQL查询结果转换成Person集合再绑定

先把DataTable里的每一行数据映射成Person对象,再绑定到GridView:

// 假设你从SQL查询得到了DataTable dt
List<Person> personList = dt.AsEnumerable().Select(row => new Person
{
    Id = row.Field<int>("Id"), // 对应数据库的Id字段
    Name = row.Field<string>("Name"), // 对应数据库的Name字段
    // 其他属性依次对应数据库字段
}).ToList();

// 把集合绑定到GridControl(注意是GridControl的DataSource,不是GridView)
gridControl1.DataSource = personList;

这样之后,GetFocusedRow()就能直接拿到Person对象了。

方案B:直接从DataRowView提取数据构造Person

如果暂时不想改数据源绑定方式,可以直接从返回的DataRowView里取数据:

private void btn_Get_Object_Details_Click(object sender, EventArgs e) 
{
    DataRowView rowView = gridView.GetFocusedRow() as DataRowView;
    if (rowView != null)
    {
        // 从DataRowView构造Person对象
        Person p = new Person
        {
            Name = rowView["Name"].ToString(),
            // 其他属性按数据库字段名提取
        };
        MessageBox.Show("name: " + p.Name);
        // 传递到新窗体
        var detailForm = new YourDetailForm();
        detailForm.SelectedPerson = p;
        detailForm.Show();
    }
    else
    {
        MessageBox.Show("请先选中一行数据!");
    }
}

额外小提示

如果你的需求是只能选一行,记得把GridView的OptionsSelection.MultiSelect设为false,避免用户多选导致逻辑混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:42