天天看點

在C#的DataGrid中實作輕按兩下和標明整行的改進方案

    因為某些怪異的原因,我需要一個可以支援DoubleClick的DataGrid。當然,DataGrid本身是有DoubleClick事件的,但是當你輕按兩下某行資料時,這個事件是不被引發的。

    原因很簡單,根據Henry手記的解釋,在M$的系統裡,DataGrid是一個容器,包含了一些TextBox之類的控件。而這些控件才是顯示資料的。換而言之,你點資料時,以為你點的是DataGrid,其實卻是在點TextBox……

    Borland的DBGrid就完全不同了,你可以很友善地通過DoubleClick一行資料來引發DBGrid的DoubleClick事件。從這裡就可以看出M$那幫白癡是些什麼玩意。

    Henry在他的文章裡用TableStyles和GridColumnStyles解決了標明整行的問題。很不錯,是嗎?

    我也用這些玩意嗎?不。實際上,我讨厭列風格,太麻煩了。

    那麼想想看,既然DataGrid是一個容器,包含了顯示資料的TextBox之類。那麼我就可以枚舉所有的子控件,然後關聯事件……好吧。

foreach(Control ctrlTemp in dataGrid1.Controls)

{

  ctrlTemp.DoubleClick+=new EventHandler(GridDoubleClickHandle);

}

private void GridDoubleClickHandle(object sender, System.EventArgs e)

{

  MessageBox.Show("asdfas");

}

    Very exciting,不是嗎?那麼標明整行有類似的代碼:

foreach(Control ctrlTemp in dataGrid1.Controls)

{

  ctrlTemp.Click+=new EventHandler(GridEnterHandle);

}

private void GridEnterHandle(object sender, System.EventArgs e)

{

  ((Control)sender).Visible=false;

  dataGrid1.Select(dataGrid1.CurrentRowIndex);

}

    但是這2個效果隻能取1個。因為還沒等你第2個Click,Enter就已經被引發,于是那個格子就失去焦點了……

就這樣吧。