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

DataGridViewComboBoxColumn加载时显示空白仅点击可见问题求解

问题修复方案

核心问题根因

你遇到的ComboBox列初始化空白问题,由3个配置错误共同导致:

  • DataPropertyName与绑定字段不匹配:ComboBox列的ValueMember设为唯一标识ContactsID,但DataPropertyName错误绑定到显示字段Contact,和主数据源的字段类型无法匹配,导致初始化时无法完成值映射
  • 绑定顺序错误:先给DataGridView绑定主数据源,之后才插入ComboBox列,列的初始值渲染逻辑未被触发
  • DefaultCellStyle.NullValue赋值错误:直接将DataColumn对象赋值给该属性,而非需要显示的默认字符串

具体修改步骤

1. 修改主数据源加载逻辑

你需要先给主表AgingeInvoice新增ContactsID字段存储联系人唯一标识,同时调整查询逻辑获取该ID值:

public void grdAgingeInvoice(int RowIndex) {
  DataTable DTCombo = new DataTable();
  try {
    var AgingeInvoice = new DataTable();
    var tEMP = new DataTable();
    string Query;
    grdAgingInvoice.DataSource = null;
    grdAgingInvoice.Columns.Clear();
    Query = "Select Aging, DueInvoiceNo, DueDate,  Balance,CompanyID from AgingInvoice where CompanyID=" + grdCompany.Rows[RowIndex].Cells["CompanyID"].Value.ToString() + " Order by Aging Desc";
    AgingeInvoice = StMethod.GetListDT<DueInvoice>(Query);
    // 新增ContactsID字段存储联系人唯一标识
    AgingeInvoice.Columns.Add("ContactsID", typeof(int));
    AgingeInvoice.Columns.Add("ContactsName");
    AgingeInvoice.Columns.Add("EmailAddress");
    AgingeInvoice.Columns.Add("Summation");
    AgingeInvoice.Columns.Add("Address");
    AgingeInvoice.Columns.Add("Description");
    var Summation = default(decimal);
    foreach (DataRow dr in AgingeInvoice.Rows) {
      Summation = Summation + Convert.ToDecimal(dr["Balance"]);
      dr["Summation"] = Summation;
      // 查询语句新增Contacts.ContactsID字段
      string StrAddress = "SELECT Contacts.ContactsID, ( Contacts.FirstName+' '+Contacts.LastName) AS Contact, Contacts.EmailAddress,Joblist.Address,JobList.Description FROM JobList INNER JOIN Contacts ON JobList.ContactsID = Contacts.ContactsID WHERE JobList.JobNumber= '" + Program.GetJobNumber(dr["DueInvoiceNo"].ToString()) + "'";
      tEMP = StMethod.GetListDT<InvoiceAddress>(StrAddress);
      if (tEMP.Rows.Count > 0) {
        // 存储ContactsID到主表
        dr["ContactsID"] = tEMP.Rows[0]["ContactsID"];
        dr["ContactsName"] = tEMP.Rows[0]["Contact"].ToString();
        dr["EmailAddress"] = tEMP.Rows[0]["EmailAddress"].ToString();
        dr["Address"] = tEMP.Rows[0]["Address"].ToString();
        dr["Description"] = tEMP.Rows[0]["Description"].ToString();
      }
    }
    // 先加ComboBox列,再绑定主数据源
    grdAgingInvoice.Columns.Insert(5, AddContactCombo());
    grdAgingInvoice.DataSource = AgingeInvoice;
    string Query2 = string.Empty;
    String query3 = "SELECT (FirstName +' '+ LastName) AS Contact,";
    Query2 = query3 + "EmailAddress,ContactsID ";
    Query2 = Query2 + "FROM contacts ";
    Query2 = Query2 + "WHERE (IsDelete=0 or IsDelete IS NULL) AND Companyid=";
    Query2 = Query2 + grdCompany.Rows[grdCompany.CurrentRow.Index].Cells["CompanyID"].Value.ToString();
    {
      var withBlock = grdAgingInvoice;
      withBlock.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
      withBlock.Columns["CompanyID"].Visible = true;
      withBlock.Columns["DueInvoiceNo"].HeaderText = "Due InvoiceNo";
      withBlock.Columns["DueDate"].HeaderText = "Due Date";
      withBlock.Columns["EmailAddress"].HeaderText = "Email Address";
      withBlock.Columns["Description"].HeaderText = "Job Description";
      withBlock.Columns["ContactsName"].Visible = false; // 原文本列可以隐藏
    }
  }
  catch (Exception ex) {
    MessageBox.Show(ex.Message.ToString());
  }
}

2. 修改ComboBox列配置方法

修正DataPropertyName、NullValue的错误配置:

public DataGridViewComboBoxColumn AddContactCombo() {
  DataGridViewComboBoxColumn ComboBoxContactsName = new DataGridViewComboBoxColumn();
  try {
    DataTable dt2 = new DataTable();
    dt2 = StMethod.GetListDT<InvoiceAddress>("SELECT (Contacts.FirstName +' '+ Contacts.LastName) as Contact,Contacts.EmailAddress,ContactsID FROM contacts where (Contacts.IsDelete=0 or Contacts.IsDelete IS NULL) AND Contacts.Companyid=" + grdCompany.Rows[grdCompany.CurrentRow.Index].Cells["CompanyID"].Value.ToString());
    ComboBoxContactsName.DataSource = dt2;
    ComboBoxContactsName.DisplayMember = "Contact";
    ComboBoxContactsName.ValueMember = "ContactsID";
    ComboBoxContactsName.DisplayIndex = 5;
    ComboBoxContactsName.HeaderText = "Contacts Name";
    // DataPropertyName绑定主表存储ContactsID的字段
    ComboBoxContactsName.DataPropertyName = "ContactsID";
    ComboBoxContactsName.Name = "cmbContactsName";
    // 空值默认显示为空字符串,可按需修改
    ComboBoxContactsName.DefaultCellStyle.NullValue = string.Empty;
    return ComboBoxContactsName;
  }
  catch (Exception ex) {
    return ComboBoxContactsName;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:36:03