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

C# WinForm ComboBox初始化加载显示System.Data.DataRowView问题排查

问题原因

  1. 下拉框属性赋值顺序错误:你给矩阵ComboBox设置属性时,先赋值了DataSource,之后才设置DisplayMember和ValueMember。当数据源绑定到控件时,控件还未获知要展示的字段名,会直接调用数据源项的ToString()方法渲染,DataRowView类型的默认ToString()返回值就是类名System.Data.DataRowView。
  2. 配置文件下拉框初始化时序问题:如果你的矩阵列表绑定逻辑写在ddProfile的SelectedIndexChanged事件中,窗体加载时配置文件下拉框的绑定逻辑未完全执行完毕,第一次触发事件时SelectedValue可能为空,导致查询到的矩阵表结构异常,也会出现展示错误。
  3. 附加非致命问题:你的矩阵表查询逻辑重复调用了两次DBConnector.GetTable,属于冗余代码,不会直接导致显示错误,但会额外触发一次无效的数据库查询。

修复方案

  1. 调整绑定属性的赋值顺序:所有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;
    }
}
  1. 保证初始化时序正确:如果矩阵绑定逻辑在SelectedIndexChanged事件中,可在窗体类中加一个布尔类型标识位_isFormLoaded,在Form_Load所有逻辑执行完毕后再设为true,事件中只有标识位为true时才执行绑定,同时在Form_Load最后主动调用一次矩阵绑定逻辑,避免第一次加载不触发的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:02