C# WinForm ComboBox初始化加载显示System.Data.DataRowView问题排查
问题原因
- 下拉框属性赋值顺序错误:你给矩阵ComboBox设置属性时,先赋值了
DataSource,之后才设置DisplayMember和ValueMember。当数据源绑定到控件时,控件还未获知要展示的字段名,会直接调用数据源项的ToString()方法渲染,DataRowView类型的默认ToString()返回值就是类名System.Data.DataRowView。 - 配置文件下拉框初始化时序问题:如果你的矩阵列表绑定逻辑写在
ddProfile的SelectedIndexChanged事件中,窗体加载时配置文件下拉框的绑定逻辑未完全执行完毕,第一次触发事件时SelectedValue可能为空,导致查询到的矩阵表结构异常,也会出现展示错误。 - 附加非致命问题:你的矩阵表查询逻辑重复调用了两次
DBConnector.GetTable,属于冗余代码,不会直接导致显示错误,但会额外触发一次无效的数据库查询。
修复方案
- 调整绑定属性的赋值顺序:所有ComboBox数据绑定时,统一先设置
DisplayMember、ValueMember,再赋值DataSource,修改后的矩阵绑定代码如下:
// 仅保留一次有效查询,删除冗余的第二次GetTable调用 DataTable dtMatrix = DBConnector.GetTable("RiskMatrixList", "*", "", $"Profile={ddProfile.SelectedValue}", DBConnector.ConnectionType.Templates); // 先设置展示、值字段,再绑定数据源 ddRiskMatrix.DisplayMember = "Description"; ddRiskMatrix.ValueMember = "ID"; ddRiskMatrix.DataSource = dtMatrix; ddRiskMatrix.Enabled = dtMatrix.Rows.Count > 1; foreach (DataRow dr in dtMatrix.Rows) { if (dr["IsDefault"].ToString() == "1") { ddRiskMatrix.SelectedValue = dr["ID"].ToString(); break; } }
- 保证初始化时序正确:如果矩阵绑定逻辑在
SelectedIndexChanged事件中,可在窗体类中加一个布尔类型标识位_isFormLoaded,在Form_Load所有逻辑执行完毕后再设为true,事件中只有标识位为true时才执行绑定,同时在Form_Load最后主动调用一次矩阵绑定逻辑,避免第一次加载不触发的问题。
内容的提问来源于stack exchange,提问作者sharpcodes
相关产品推荐
相关产品推荐

