[C#]DataGridView的RowChanged event
今天在寫一個Winform的小工具時,意外的發現DataGridView竟然沒有RowChanged一類當選擇的RowIndex改變時的事件,這個需求是這樣來滴,我寫了一個小工具會去解析EventLog的內容,但因為其中一個欄位是text,內容太長,在Grid中不好呈現,所以我打算把它放到下方的TextArea中:
由於DataGridView本身有CellClick或者CellContentClick的事件,所以我可以在這個事件中去觸發將Message欄位帶到下方的動作,但如果我使用鍵盤上下移動focus,這個功能就失效了:
解決方法是使用BindingManagerBase這個物件來協助我們進行RowChanged事件的模擬,我修改我的程式如下:
private void btnSourceXML_Click(object sender, EventArgs e)
{
ofdSourceXML.ShowDialog();
txtSourceMXL.Text = ofdSourceXML.FileName;
if (txtSourceMXL.Text != "")
{
DataSet tDS = new DataSet();
tDS.ReadXml(txtSourceMXL.Text);
gvList.DataSource = tDS.Tables[0];
}
//DataGridView本身沒有RowChange事件,綁到BindingManagerBase中使用他的PositionChanged事件
BindingManager = this.BindingContext[gvList.DataSource];
BindingManager.PositionChanged += new System.EventHandler(GridView_RowChanged);
}
private void GridView_RowChanged(object sender, System.EventArgs e)
{
int tRowIndex = BindingManager.Position;
txtMessage.Text = gvList.Rows[tRowIndex].Cells["Message"].Value.ToString();
}
宣告一個BindingManagerBase物件,將BindingManagerBase物件與我的DataGridView的資料來源做綁定,接著註冊好BindingManagerBase的PositionChanged事件,並在該事件中去取得DataGridView這筆Row的Message欄位值,放到TextArea中,這樣子就大功告成囉。
游舒帆 (gipi) 探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。 |