因為某些怪異的原因,我需要一個可以支援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就已經被引發,于是那個格子就失去焦點了……
就這樣吧。