首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridViewComboBox DataSource

DataGridViewComboBox DataSource
EN

Stack Overflow用户
提问于 2012-02-26 17:38:18
回答 3查看 4.5K关注 0票数 3

我现在有一个2列宽的DataGridView,第一列是DataGridViewTextBoxColumn,第二列是DataGridViewComboBoxColumn。我还有一个预先生成的泛型列表(string),它将用作每一行的DataSource。

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

代码语言:javascript
复制
dataGridView.Rows.Add("Column1Text", "Column2Text");

网格视图数据将按预期填充,同时适当显示理想项的DataGridViewComboBox。

问题是,当单击DataGridViewComboBox时,不会删除任何项。我已经检查过DataGridViewComboBox是否包含项。DataGridViewTextBoxColumn的AutoSizeMode设置为“填充”(如果有任何关联的话)。

对我可能做错了什么有什么见解吗?当单击给定的单元格时,是否必须手动删除这些项?谢谢。

更新

我尝试了两种不同的方法,将泛型列表绑定为DataSource。

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

代码语言:javascript
复制
col_key.DataSource = KeyList;

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

代码语言:javascript
复制
(DataGridViewComboBoxCell)(row.Cells[1]).DataSource = KeyList;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-26 18:58:22

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

代码语言:javascript
复制
//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;
        }
    }

}

要填充网格:

代码语言:javascript
复制
    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;
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2012-08-22 12:07:51

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

代码语言:javascript
复制
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
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2014-04-25 09:03:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9455419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档