DataGridViewComboBox DataSource
本文关键字:DataSource DataGridViewComboBox | 更新日期: 2023-09-27 18:25:47
我目前有一个2列宽的DataGridView,第一列是DataGridViewTextBoxColumn,第二列是DataGrid ViewComboBoxColumn。我还有一个预先生成的泛型List(字符串),它将用作每行DataGridViewComboBox的DataSource。
最后,我有一个循环,它遍历一系列字符串并相应地解析它们,提取的值使用如下所示的方法应用于各个单元格:
dataGridView.Rows.Add("Column1Text", "Column2Text");
网格视图数据按预期填充,同时DataGridViewComboBox正确显示理想项。
问题是,单击DataGridViewComboBox时,不会下拉任何项目。我已检查DataGridViewComboBox是否包含项。DataGridViewTextBoxColumn的AutoSizeMode设置为"填充"(如果它具有任何相关性)。
对我可能做错了什么有什么见解吗?单击给定单元格时,是否必须手动下拉项目?谢谢
更新
在将泛型列表绑定为DataSource方面,我尝试了两种不同的方法。
第一个是通过:绑定整个列本身的DataSource
col_key.DataSource = KeyList;
第二种方法是绑定对应行中每个新DataGridViewComboBoxCell的DataSource:
(DataGridViewComboBoxCell)(row.Cells[1]).DataSource = KeyList;
这两种方法都会在运行时编译并正确添加必要的项,但单击时不会下拉任何项。
我选择在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
}
}
}
要填充网格组合列,您应该将其视为常规组合,组合的数据源应该有一个valuemember和一个displaymember,因此请检查以下示例:
//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;
}
}
我也遇到了类似的问题。我发现将DGV的EditMode属性设置为EditOnEnter(以前是EditProgrammatically)解决了这个问题。这可以在设计器中完成。