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

