【发布时间】:2018-11-16 23:50:55
【问题描述】:
假设我拥有的数据是'valuenumber1'、'valuenumber2'、'valuenumber3'。
我有一个问题在哪里'valuenumber2'或@ 487654329 @或'valuenumber3'将创建下一行,但前一行('valuenumber2'或'valuenumber3')将改为'valuenumber1',这导致所有创建的行的值仅为'valuenumber1'。
例如(请原谅我的图片编辑):
我的代码示例:
注意:'cto' 是与 Oracle 的连接
public class Result
{
public Result()
{
ds = new DataSet();
}
private DataSet ds;
public List<ComboItems> LCI { get; set; }
public DataSet ResultDataSet
{
get
{
return ds;
}
set
{
ds = value;
}
}
}
public class ComboItems
{
public string objectName { get; set; }
public string objectID { get; set; }
public ComboItems(){}
public ComboItems(string objectName, string objectID): this()
{
this.objectName = objectName;
this.objectID = objectID;
}
public override string ToString()
{
return objectName;
}
}
public Result GetList()
{
Result rs = new Result();
string commandText = "SELECT CUST_CODE, CUST_NAME FROM MAIN_CUSTOMER";
rs.ResultDataSet = cto.Select(commandText);
int maxRow = rs.ResultDataSet.Tables[0].Rows.Count;
List<ComboItems> lci = new List<ComboItems>();
for (int tblrow = 0; tblrow < maxRow; tblrow++)
{
ComboItems ci = new ComboItems();
ci.objectID = rs.ResultDataSet.Tables[0].Rows[tblrow]["CUST_CODE"].ToString();
ci.objectName = rs.ResultDataSet.Tables[0].Rows[tblrow]["CUST_NAME"].ToString();
lci.Add(ci);
}
rs.LCI = lci;
return rs;
}
private void loadProjectList()
{
Result rs = GetList();
DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
cmb.HeaderText = "Select Data";
cmb.Name = "cmb";
cmb.MaxDropDownItems = 4;
foreach (ComboItems ci in rs.LCI)
{
cmb.Items.Add(ci);
}
dgvList.Columns.Add(cmb);
this.dgvList.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(dgvList_EditingControlShowing);
}
我尝试使用 EditingControlShowing 事件处理程序,但它不起作用:
private void dgvList_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox cmb = e.Control as ComboBox;
if (cmb != null)
cmb.SelectedIndex = -1;
}
由于 datagridview 中的 ComboBox 没有 SelectedIndex,是否还有其他我不知道的解决方案,即使用其他事件处理程序?
【问题讨论】:
-
该行为无法在完全未绑定的
DataGridview中重现。但是,如果您有一个包含一些绑定列和一些未绑定列的 datagridview,则未绑定列将丢失它们的值。考虑发布minimal reproducible example。 -
复制以下代码并粘贴到
Load清理表单的事件中,运行应用程序并查看结果:var dgv = new DataGridView(); dgv.Dock = DockStyle.Fill; var combo = new DataGridViewComboBoxColumn(); combo.Items.AddRange(new string[] { "1", "2", "3" }); combo.HeaderText = "Combo"; dgv.Columns.Add(combo); this.Controls.Add(dgv); dgv.BringToFront(); -
这就是为什么我说minimal reproducible example 是必需的。我们怎么知道你是在什么情况下进行测试的?我们怎么知道
BusinessLayer.GetList();的结果是什么?另外还不清楚您的DataGridView是如何设置的。 -
您应该能够使用我分享的非常简单的代码来重现问题。
标签: c# winforms datagridview datagridviewcombobox datagridviewcomboboxcolumn