c#DataGridView离开事件使Windows窗体无响应

时间:2014-09-26 20:35:42

标签: c# c#-4.0 datagridview

我在c#-4.0 Windows窗体应用程序中遇到了一些奇怪的东西,我不确定是什么导致它。基本上,我有一个带有DataGridView和一些文本框的表单,在我的网格中,我有一个离开事件,当用户离开DataGridView时会选择Rows[0].Cells[0]

现在,如果我单击网格中的单元格,编辑单元格并直接单击文本框,则事件正确触发并选择行/单元格[0],但此时表单无响应。

如何使用Visual Studio进行复制(我正在使用2010 Pro)

  • 创建新的 WindowsFormApplication
  • DataGridView TextBox 添加到表单中。
  • 现在,在Form1_Load事件中添加以下代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dtTmp = new DataTable("temp");
        dtTmp.Columns.Add("col 1", typeof(String));
        dtTmp.Columns.Add("col 2", typeof(String));
    
        DataSet dsTmp = new DataSet();
        dsTmp.Tables.Add(dtTmp);
    
        DataRow dr1 = dsTmp.Tables["temp"].NewRow();
        dr1["col 1"] = "aaa";
        dr1["col 2"] = "12";
        dsTmp.Tables["temp"].Rows.Add(dr1);
    
        DataRow dr2 = dsTmp.Tables["temp"].NewRow();
        dr2["col 1"] = "bbb";
        dr2["col 2"] = "1234";
        dsTmp.Tables["temp"].Rows.Add(dr2);
    
        dataGridView1.DataSource = dsTmp;
        dataGridView1.DataMember = "temp";
        dataGridView1.Refresh();
    }
    

接下来,为DataGridView1创建一个Leave事件并添加以下代码:

private void dataGridView1_Leave(object sender, EventArgs e)
{
    if (dataGridView1.Rows.Count > 0)
    {
        dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0];
    }
}

调试并执行以下步骤:

  1. 点击 col 1 第二行中包含“bbb”的单元格。
  2. 在该单元格中键入其他内容。
  3. 无需点击输入,空格,制表符,向下箭头或向右箭头 ,点击您添加到表单中的文本框
  4. 现在尝试关闭表单,它不会关闭。

    我的dataGridView1.CurrentCell行有什么问题?如果您选择并编辑第一行,则表单会正常关闭,但如果是第二行则不会。

1 个答案:

答案 0 :(得分:4)

不确定它是如何干扰的,但是Leave事件正在干扰某些事情。通常我的治疗方法是,尝试在离开事件后运行代码

void dataGridView1_Leave(object sender, EventArgs e) {
  this.BeginInvoke(new Action(() => {
    if (dataGridView1.Rows.Count > 0) {
      dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0];
    }
  }));
}