2013-06-13 117 views
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

感謝

回答

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

感謝您的答覆。我真的想在SelectionChanged中完成這項工作,因爲我正在做其他代碼。我只提供了textBox1作爲這個問題的一個例子。所以想要我真的想要的是SelectionChanged事件觸發。 – Sun

+0

然後將您的代碼從事件移動到其他代碼,該代碼以'DataGridViewCell'或'RowIndex'和'ColumnIndex'作爲參數,並在那裏進行處理,並在選擇已更改或新行已添加時調用此方法。更好的方法(海事組織)清除代碼,並更耐'DataGridView'神奇:) – gzaxx

相關問題