首页 新闻 会员 周边 捐助

C# Winform的DataGridView添加ComboBox列之后,ComboBox双击才下拉,并且数据显示有问题

0
悬赏园豆:30 [已关闭问题] 关闭于 2020-06-25 09:50

C# Winform的DataGridView添加ComboBox列之后:

第一种:通过动态新建行(DataGridView.addRow)之后:
1)ComboBox第一次点击不会下拉,但是会显示第一项的文本;第二次点击才会下拉。
2)选择下拉选项后,点击其他单元格(也就是ComboBox此时失去焦点),那么ComboBox文本自动清空;
3)自动清空后回过头来点击ComboBox,又是显示第一项文本——1)的状态。

第二种:不动态新建行
1)ComboBox失去焦点后重新点击,不会重新显示第一项,而是手工设置的选项。

=====================================================

相关代码如下:

DataGridViewComboBoxColumn dc2 = new DataGridViewComboBoxColumn();
dc2.HeaderText = "对应代码";
//dc2.Items.AddRange(new GetICItem().getAllFNumber());
List<ICItemRefDatas> r = new GetICItem().getAllParams();
List<ItemObject> items = new List<ItemObject>();
if (r != null)
{
for (int i = 0; i < r.Count; i++)
{
ItemObject t = new ItemObject(r[i].FName + " | " + r[i].FModel + " | " + r[i].FCUUnit_ID, r[i].FNumber);
items.Add(t);
}
}
dc2.DataSource = items.ToArray();
dc2.ValueMember = "Value";
dc2.DisplayMember = "Text";
dataGridView1.Columns.Add(dc2);

//设置表头不能被点击,这是很重要的代码!否则点击表头时,会重新触发事件EditingControlShowing。假如原来焦点在combobox上,现在依旧会在combobox上,那么在EditingControlShowing中的combobox处理代码会再重新处理一遍
foreach (DataGridViewColumn column in dv.Columns)
{
column.SortMode = DataGridViewColumnSortMode.NotSortable;
}

dv.AllowUserToAddRows = false;
dv.EditingControlShowing += dataGridView1_EditingControlShowing; //这行不处理什么
dv.EditMode = DataGridViewEditMode.EditOnEnter;

//-------------------------------------

private class ItemObject
{
private string text = "", value = "";

        public ItemObject(string _text, string _value)
        {
            this.text = _text;
            this.value = _value;
        }
        /*
        public override string ToString()
        {
            return this.text;
        }
        */
        public string Text
        {
            get
            {
                return this.text;
            }
        }
        public string Value
        {
            get
            {
                return this.value;
            }
        }
    }

//-------------------------------------

//添加新行的按钮事件,可能是关键所在
private void AddButton_Click(object sender, EventArgs e){
DataGridView dv = this.dataGridView1;
int newRowIndex = dv.Rows.Add(); //单纯此句的话,新行无法获得焦点
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[newRowIndex].Cells[0];
}

PER10的主页 PER10 | 初学一级 | 园豆:8
提问于:2019-08-31 16:03
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册