DataGridView SelectionChanged通过代码选择新行时不触发事件

时间:2013-06-13 08:26:21

标签: c#-4.0 datagridview selectionchanged

我有一个DataGridView,其DataSource设置为DataTable。因此,请使用此代码作为示例:

DataTable table;
table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Last_Name", typeof(string));
table.Columns.Add("Male", typeof(Boolean));

DataRow row;

for (int i = 1; i < 10; i++)
{
    row = table.NewRow();
    row["Name"] = String.Format("Person {0}", i + 1);
    row["Last_Name"] = String.Format("Person Last Name {0}", i + 1);

    if (i % 2 == 0)
    {
        row["Male"] = true;
    }
    else
    {
        row["Male"] = false;
    }

    table.Rows.Add(row);
}

dataGridView1.DataSource = table;

我还订阅了SelectionChanged事件,该事件只显示文本框中第一个单元格的内容。见下文:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentRow != null)
    {
        DataRowView row = dataGridView1.CurrentRow.DataBoundItem as DataRowView;
        if (row != null)
        {
            textBox1.Text = row.Row[0].ToString();
        }
    }
}

当我更改行时,SelectionChanged事件将触发,内容将在文本框中正确显示。

现在我有了一个向网格添加新行的按钮:

private void buttonAdd_Click(object sender, EventArgs e)
{
    DataRow row= table.NewRow();
    row["Name"] = "Bob";
    row["Last_Name"] = "Smith";
    row["Male"] = true;
    table.Rows.Add(row);
}

新行现已添加到网格中,但未选中。

所以我尝试通过订阅RowsAdded事件来选择它:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
}

所以这现在正确地选择了行但是SelectionChanged事件没有触发,文本框仍然显示以前选择的行的结果。

我可以做些什么来绕过这个或我做错了什么?

奇怪的是,如果我再次点击添加按钮,那么我在第一次点击时添加的行会被选中!?

我正在使用C#4.0&amp; Visual Studio 2012。

由于

1 个答案:

答案 0 :(得分:0)

首先,为什么不在添加和更改标签后选择行?

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}

如果您只想通过触发事件更改标签,可以先尝试取消选择单元格:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    dataGridView1.CurrentCell = null;

    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}