我有一个 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 和 Visual Studio 2012。
谢谢