[C#]DataGridView的RowChanged event

[C#]DataGridView的RowChanged event

今天在寫一個Winform的小工具時,意外的發現DataGridView竟然沒有RowChanged一類當選擇的RowIndex改變時的事件,這個需求是這樣來滴,我寫了一個小工具會去解析EventLog的內容,但因為其中一個欄位是text,內容太長,在Grid中不好呈現,所以我打算把它放到下方的TextArea中:

image

 

由於DataGridView本身有CellClick或者CellContentClick的事件,所以我可以在這個事件中去觸發將Message欄位帶到下方的動作,但如果我使用鍵盤上下移動focus,這個功能就失效了:

image

 

解決方法是使用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堂課》,為培養台灣未來的領袖而努力。