日期:2014-05-18  浏览次数:20868 次

见鬼了, 插入DataGridViewComboBoxColumn列后的奇怪问题

我是在一个自定义组件中使用了DataGridView控件, 在该组件的Load事件中, 我加入了如下代码

生成一个DataTable, 将其与DataGridView绑定, 其中第1列是Column1, 我在其后插入一列Column2, 将Column2定义成了DataGridViewComboBoxColumn类型, 代码如下

DataGridViewComboBoxColumn field_col = new DataGridViewComboBoxColumn();
field_col.HeaderText = "Field Name";
field_col.DataSource = tb_col; //这是一个自己生成的表, 里面是下拉内容
field_col.DisplayMember = "col_desc";
field_col.ValueMember = "col_name";
field_col.SortMode = DataGridViewColumnSortMode.NotSortable;
field_col.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
this.dgSort.Columns.Insert(1, field_col);

然后将Column1的值赋到Column2中, Column1中的值为ID类型的值, 在Column2中显示描述性信息

for (int iRow = 0; iRow < this.dgSort.Rows.Count; iRow++)
{
this.dgSort[1, iRow].Value = Convert.ToString(this.dgSort[0, iRow].Value).ToUpper();
}

如果在此时插入MessageBox时, 会发现一切正常, 但等执行完毕后, 会发现下拉列内的值都被清空了, 而且在后台检查, 发现Column2跑到DataGridViewColumns的第0列上去了, 而Column1跑到第1列上去了, 本来我是将Column2插到Column1后面去的

------解决方案--------------------
this.dgSort.Columns.Insert(1, field_col); 

把insert换成add试试
或者this.dgSort.Columns.Insert(2, field_col); 

------解决方案--------------------
看看
.NET中最强,最全功能的表格控件
ivanx 著于2007-8-23 16:58:46
由于项目需要,我需要定制一个ListView,它必须能够在列中插入图像、下拉框、可上下调整的数字、进度条等等。于是本文产生了...
------解决方案--------------------
对于在自定义组件(从UserControl派生)中使用DataGridView, 添加自列义列后的后台列与前台列顺序不一致, 我也遇到过, 我的解决方法是不要将添加列的代码写在组件的Load事件中, 而是使用公用函数, 在创建组件后手工调用

例如, 原先是

xxx_Load()
{
//添加自定义列
}

改成

public void AddColumn()
{
//添加自定义列
}

添加组件时这样使用

xxx c = new xxx();
c.AddColumn();