2011-05-20 21 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); 
    } 
} 
相关问题