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
相关产品推荐
相关产品推荐

