执行快速单击时,C#dataGridView在Windows XP下不会返回正确的单元格值

时间:2014-06-20 21:25:53

标签: c# .net winforms datagridview

我有一个使用dataGridView的Winform应用程序。我想要做的是当用户点击单元格时,它会将单元格内容显示到文本框中。以下是我处理click事件的代码:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex >= 0)
        {                
            DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
            textBox1.Text = row.Cells["Name"].Value.ToString();
        }            

    }

在Windows 7中一切正常。但是,当我在Windows XP下运行它时,存在一个问题。

我将用一个简单的例子解释这个问题。我用一个按钮向dataGridView添加一些数据:

private void button1_Click(object sender, EventArgs e)
    {
        dataGridView1.Rows.Add("John","123");
        dataGridView1.Rows.Add("Rob","456");            
    }

因此,如果您点击第一行,文本框将显示" John&#34 ;;如果你点击第二行,它将是" Rob"。这在Windows 7下工作正常,如果你执行点击有一些延迟(如1秒),它也可以在Windows XP下正常工作。但是,如果您执行快速点击,例如在第一行和第二行之间的一秒钟内进行5到6次,很长一段时间,文本框将显示" Rob"即使你点击第一行,或其他方式。它根据行没有显示正确的数据。

我已尝试在每次单击之间启用禁用dataGridView /刷新dataGridView,但它们都不起作用。唯一有效的是延迟鼠标点击:点击后移动光标位置或显示消息框,它们只是解决方法,但不是真正的解决方案。

以前有过这样的经历吗?这是一个Windows XP" bug"?顺便说一句,我的开发环境是带有VS2010的Window 7。感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试在执行任务之前添加检查。尝试这样的事情:

if (e.RowIndex >= 0 && this.dataGridView1.SelectedCells[0].RowIndex == e.RowIndex)
{
     DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
     textBox1.Text = row.Cells["Name"].Value.ToString();
}

答案 1 :(得分:0)

我找到了一个解决方案:

我正在使用Cell Click事件处理选择,它应该可以工作,但不确定为什么它在Windows XP下无法运行。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)' with handle 'this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellClick);

然后我将选择方式改为selectionchange,它在Windows 7和Windows 7中都能正常工作。 XP。

private void dataGridView1_SelectionChanged(object sender, EventArgs e)

this.dataGridView1.SelectionChanged += new System.EventHandler(dataGridView1_SelectionChanged);