DataGridViewComboBox 数据源

Posted

技术标签:

【中文标题】DataGridViewComboBox 数据源【英文标题】:DataGridViewComboBox DataSource 【发布时间】:2012-02-26 17:38:18 【问题描述】:

我目前有一个 2 列宽的 DataGridView,第一列是 DataGridViewTextBoxColumn,第二列是 DataGridViewComboBoxColumn。我还有一个预先生成的通用列表(字符串),将用作每行的 DataGridViewComboBox 的数据源。

最后,我有一个循环遍历一系列字符串并相应地解析它们,提取的值使用如下所示应用于各个单元格:

dataGridView.Rows.Add("Column1Text", "Column2Text");

gridview 数据按预期填充,同时 DataGridViewComboBox 正确显示理想项目。

问题是,DataGridViewComboBox 在单击时不会下拉任何项目。我检查了 DataGridViewComboBox 是否包含项目。 DataGridViewTextBoxColumn 的 AutoSizeMode 设置为“填充”(如果有任何相关性)。

任何关于我可能做错了什么的见解?单击给定单元格时是否必须手动下拉项目?谢谢。

更新

在将通用列表绑定为 DataSource 方面,我尝试了两种不同的方法。

第一个是通过以下方式绑定整个列本身的DataSource:

col_key.DataSource = KeyList;

第二种方法是在相应行中绑定每个新DataGridViewComboBoxCell的DataSource:

(DataGridViewComboBoxCell)(row.Cells[1]).DataSource = KeyList;

这两种方法都会在运行时编译并正确添加必要的项目,但单击时不会下拉任何项目。

【问题讨论】:

你也可以显示绑定吗?以某种方式感觉不对,将除 DataGridViewRow 之外的任何其他内容添加到 .Rows 能否请您添加选择组合框列时的网格截图? 你能说明你是如何从预先生成的列表中填充 ComboBox 的吗?我不认为我不熟悉这种技术。 预生成的列表只是一个通用列表,它在使用 DataGridView 完成任何操作之前填充。 @NateShoffner:如果多次单击单元格会发生什么?依然没有?顺便说一句,您是否将 DisplayMember 和 ValueMember 留空?他们应该是。 【参考方案1】:

我选择在 CellEnter 事件中处理这个问题:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    
        if (e.ColumnIndex == 2)
        
            DataGridViewComboBoxCell cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
            if (cell.DataSource == null)
            
                cell.DataSource = this._ComboItemsBindingSource;
                cell.DisplayMember = "Value"; //lite-weight wrapper on string
                cell.ValueMember = "Value";   //where Value is a property
            
        
    

【讨论】:

【参考方案2】:

要填充网格组合列,您应该将其视为常规组合,组合的数据源应具有值成员和显示成员,因此请查看以下示例:

//Coded by Amen Ayach's DataClassBuilder @26/02/2012
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class iddesc

    private int _id;
    public int id
        get 
            return _id;
        
        set 
            _id = value;
        
    

    private string _description;
    public string description
        get 
            return _description;
        
        set 
            _description = value;
        
    


填充网格:

    private void FillData()
    
        List<iddesc> DataList = new List<iddesc>();
        for (int i = 1; i < 11; i++)
        
            DataList.Add(new iddesc()  id = i, description = "Desc" + i.ToString() );
        
        ComboCol.ValueMember = "id";
        ComboCol.DisplayMember = "description";
        ComboCol.DataSource = DataList;

        for (int i = 0; i < 10; i++)
        
            grd.Rows.Add();
            grd[ComboCol.Name, i].Value = DataList[i].id;//Here you deliver the valuemember
            grd[Column1.Name, i].Value = DataList[i].description;
        
    

【讨论】:

刚刚尝试使用这个 sn-p(在必要时更改名称),我遇到了一些问题。内容加载,但是当我单击组合框时,没有任何反应。它也可以与标准的 WinForms ComboBox 完美配合。 @NateShoffner ,我认为它只是:ComboCol.ReadOnly = false; 将 ReadOnly 属性设置为 true 或 false 似乎没有任何区别。 那是奇怪的兄弟,你确定ComboCol.ReadOnly = false;和 grid.ReadOnly = false;而且你没有取消 CellBeginEdit 事件?? 好的。我想我总是可以尝试在单击单元格或其他内容时手动删除项目列表。感谢您的帮助。【参考方案3】:

我遇到了类似的问题。我发现将 DGV 的 EditMode 属性设置为 EditOnEnter(以前是 EditProgrammatically)解决了这个问题。这可以在设计器中完成。

【讨论】:

以上是关于DataGridViewComboBox 数据源的主要内容,如果未能解决你的问题,请参考以下文章

如果 datagridviewcombobox 的值不在 datagridviewcomboboxcolumn 数据源中,我该怎么办?

dataGridViewCombobox 值未保存在导航器上保存按钮单击

具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember

DataGridViewComboBox 在不需要时更改行

将 DataGridViewComboBox 默认设置为等于现有 DataGridView 列

DataGridViewCombobox 列中的自动完成有啥奇怪的行为?