gpt4 book ai didi

c# - DataGridViewComboBoxColumn - 值滞后一瞬间

转载 作者:太空狗 更新时间:2023-10-29 22:53:15 26 4
gpt4 key购买 nike

我有一个带有几个 DataGridViewComboBoxColumns 的 DataGridView。 DataGridView 上有一个 CellEnter 事件处理程序,用于单击下拉组合框。

该列绑定(bind)到 KeyValuePairs 列表,ValueMember 是“Key”,DisplayMember 是“Value”。

当我点击一个组合框列时,它工作正常。但是,如果单元格处于“下拉”状态并且我单击另一个组合框(同一列,不同行),它会正确取消选择旧单元格,选择并下拉新单元格,但是顶部的选定值更改为一瞬间从旧单元格中获取值,然后再更改回正确的单元格。

例如,假设列表是 A、B、C。在第 1 行中选择了 A,在第 2 行中选择了 B。我单击第 1 行中的单元格,一切正常。然后,在下拉此单元格的同时,我单击第 2 行中的单元格。它正常下降,但顶部的选定值变为 A,然后立即切换回 B(正确的值)。

如果我在单击第二个组合框单元格之前单击其他列中的单元格,则不会发生这种情况。

有没有办法防止这种情况发生?

重现问题的示例代码(事件处理程序连接到明显的事件):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PDGV
{
public partial class Form1 : Form
{
List<KeyValuePair<string, string>> bindingList = new List<KeyValuePair<string, string>>();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Rows.Add(10);
bindingList.Add(new KeyValuePair<string,string>("aaa", "111"));
bindingList.Add(new KeyValuePair<string,string>("bbb", "222"));
bindingList.Add(new KeyValuePair<string,string>("ccc", "333"));
bindingList.Add(new KeyValuePair<string,string>("ddd", "444"));
bindingList.Add(new KeyValuePair<string,string>("eee", "555"));
BindComboList(2, bindingList);

}

private void BindComboList(int columnIndex, object list)
{
var column = dataGridView1.Columns[columnIndex] as DataGridViewComboBoxColumn;
if (column != null)
{
column.DataSource = new BindingSource(list, null);
column.DisplayMember = "Value";
column.ValueMember = "Key";
}
}

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;

dataGridView1.BeginEdit(true);
var control = dataGridView1.EditingControl as DataGridViewComboBoxEditingControl;
if (control != null)
control.DroppedDown = true;
}
}
}

最佳答案

原因:

DataGridView 的 EndEdit 方法的深处,它存储了先前使用的 EditingControl 的副本 this.latestEditingControl = this.editingControl; 然后,当您开始编辑另一个单元格时,它在 BeginEditInternal 中启动。在此期间,它会检查 latestEditingControl 是否不为 null 以及编辑类型是否与最后一个单元格相同,如果是,它会重新使用该控件,这就是为什么您会看到闪光灯,它确实是同一个控件。

解决方案:

将 latestEditingControl 设置为 null,此控件无法通过普通属性/方法访问,必须使用反射。注意:这会导致完全不同的烦恼,现在您离开的单元格闪烁白色 :),但它确实解决了您寻求帮助的具体问题。

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;

//this.latestEditingControl
Type t = dataGridView1.GetType();
FieldInfo viewSetter = t.GetField("latestEditingControl", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance);
viewSetter.SetValue(dataGridView1, null);
}

关于c# - DataGridViewComboBoxColumn - 值滞后一瞬间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11465857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com