2011-05-20 69 views
3

我們有一個DataGrid,允許用戶多選單元格。但是,我們有獨特的業務需求。具體...在WPF中,如何限制DataGrid中的選擇只能是同一行或列中的單元格?

  1. 第一個單元:您可以選擇任何地方
  2. 第二單元:必須是同一行或同一列的第一個單元格要麼英寸
  3. 其他單元格:必須與第二個單元格定義在同一行或列中。

我沒有看到任何PreviewSelectionChanges方法的使用,也沒有看到任何方式來阻止Shift-Selections,它將跨越允許選擇的邊界。

我目前的想法是保持一個int? Row;int? Col;屬性,我用它來修剪選定的單元格後,我得到選擇更改事件,但這似乎並沒有真正清楚,因爲它發生在事實之後。我想要說'Cell(c,r)即將被選中的東西。你會允許嗎?'我可以從那裏去。

所以...想法?

+1

我建議,要麼從頭開始創建自己的網格或尋求第三方像的DevExpress或Telerik的。我發現內置的數據網格既是越野車,而且很難擴展。 – 2011-05-21 02:17:26

+1

內置電網是一個可怕的電網藉口。我無法相信它有多少問題!我已經轉向了Xceed,它比它需要的複雜得多,並且缺少一些簡單的東西,但它確實很穩定。不過,正如我所說,這是一個野獸! (只是窺探它!你的下巴會落在地板上!)我真的可能只是推出自己的,我可以用於簡單的佈局任務。 – MarqueIV 2011-06-29 02:52:12

回答

0

我能想到的僅僅是提前獲取信息的唯一方法就是挖掘MouseDown事件。這不會很漂亮,因爲MouseDown的位置不一定表示MouseUp的位置,但它通常是正確的。因此,如果您確定MouseDown處於「禁止」單元中,您可以提醒用戶或執行任何您想要執行的其他任務。

您也可以在MouseClick事件(我相信這是一個)中進行檢查,以首先檢查被選中的單元格是否爲「禁止」單元格。如果是,您可以取消應該停止選擇單元格的事件。根據DataGrid的工作方式(我還沒有測試它),您可能需要爲幾個鼠標事件做這件事。

+0

該方法的問題是它僅限於鼠標輸入,而不是鍵盤。儘管如此,由於沒有其他人回答,而且這種情況已經過時,我仍然會繼續向你投票。幫助我們兩個。 – MarqueIV 2011-06-29 02:53:01

0

我已成功通過響應SelectedCellsChanged事件並調整選擇。在這裏,我將'相同列'定義爲最左邊的列,這意味着拖動左邊的開關選擇哪個列,但它足夠簡單,以記住哪個列首先被選擇並限制到那個列。

例如:

void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { 
    DataGrid dg = (DataGrid)sender; 

    var first_cell = dg.SelectedCells.FirstOrDefault(); 
    if (first_cell != null) { 
     var ok_col = first_cell.Column; 
     var to_remove = dg.SelectedCells.Where(c => c.Column != ok_col).ToList(); 
     foreach (var c in to_remove) dg.SelectedCells.Remove(c); 
    } 
} 
相關問題