【问题标题】:C# dataGridView doesn't return correct cell value under Windows XP when perform fast cell clickC# dataGridView 在 Windows XP 下执行快速单元格单击时不返回正确的单元格值
【发布时间】:2014-06-20 21:25:52
【问题描述】:

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

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”;如果您单击第二行,它将是“Rob”。这在 Windows 7 下可以正常工作,如果您执行单击时有一些延迟(如 1 秒),它在 Windows XP 下也可以正常工作。但是,如果您执行快速单击,例如第一行和第二行之间的一秒内 5~6 次,很多时间,即使您单击第一行或其他方式,文本框也会显示“Rob”。它只是没有根据其行显示正确的数据。

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

有没有人经历过这种情况?这是 Windows XP 的“错误”吗?顺便说一下,我的开发环境是Window 7 with VS2010。感谢您提前提供任何帮助。

【问题讨论】:

  • 如何延迟鼠标点击?也许你可以使用睡眠? System.Threading.Thread.Sleep(1000) 将延迟 1 秒,但另一方面可能会很慢......而且我不确定这是真正的解决方案
  • 鼠标点击后,我会显示一个消息框来延迟点击单元格。

标签: c# .net winforms datagridview


【解决方案1】:

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

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();
}

【讨论】:

    【解决方案2】:

    我找到了解决办法:

    我使用 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 和 XP 中都可以正常工作。

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    
    this.dataGridView1.SelectionChanged += new System.EventHandler(dataGridView1_SelectionChanged);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-21
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多