0
我有一個DataGridView,它的DataSource設置爲DataTable。因此,使用此代碼作爲一個例子:DataGridView SelectionChanged通過代碼選擇新行時不會觸發事件
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
感謝
感謝您的答覆。我真的想在SelectionChanged中完成這項工作,因爲我正在做其他代碼。我只提供了textBox1作爲這個問題的一個例子。所以想要我真的想要的是SelectionChanged事件觸發。 – Sun
然後將您的代碼從事件移動到其他代碼,該代碼以'DataGridViewCell'或'RowIndex'和'ColumnIndex'作爲參數,並在那裏進行處理,並在選擇已更改或新行已添加時調用此方法。更好的方法(海事組織)清除代碼,並更耐'DataGridView'神奇:) – gzaxx