【问题标题】:Selected items in DataGridViewComboBoxColumn always retrieve the first valueDataGridViewComboBoxColumn 中的选定项目始终检索第一个值
【发布时间】: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


【解决方案1】:

我不认为你想以这种方式加载你的组合项目。相反,将该列绑定到您从数据库中检索的列表。像这样的:

private void loadProjectList()
{
    Result rs = GetList();

    DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
    cmb.HeaderText = "Select Data";
    cmb.Name = "cmb";
    cmb.MaxDropDownItems = 4;
    cmb.DataSource = rs.LCI;
    cmb.DisplayMember = "objectName";
    cmb.ValueMember = "objectID";

    dgvList.Columns.Add(cmb);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2011-10-02
    相关资源
    最近更新 更多