在Datagrid WPF

时间:2017-01-03 07:35:26

标签: c# wpf datagrid

我有datagrid wpf和选项:

SelectionUnit="Cell"
SelectionMode="Extended"

Datagrid有10列。我需要的是仅选择例如1-4和8-10列 - 当我将鼠标指针拖到所有数据网格单元格上时,跳过5-7列。是否有可能做到这一点?我尝试提升 SelectedCellsChanged 事件并从 DataGrid.SelectedCells 中删除项目,但后来我遇到异常:

  

此集合不支持使用特定索引更改值。

更多信息:我的表格有10列x n行。所有列都带有文本值。行代表员工。列表示天数 - 其中一些是星期六/星期日,而不是工作日。行和列中的单元格值可以相同。我希望有可能通过在数据网格上拖动鼠标指针来选择所有单元格,但是跳过这些星期六/星期日的选择,它们可以位于列的中间。

2 个答案:

答案 0 :(得分:0)

您可以使用单元格的索引选择特定列的所有单元格 并使用System.Collections.Generic.IList和System.Collections.Generic.KeyValuePair

了解更多信息:

You can see here

答案 1 :(得分:0)

在您的DataGrid XAML中,为SelectedCellsChanged设置事件处理程序:

SelectedCellsChanged="CustomGrid_SelectedCellsChanged"

现在,在您的代码后面,添加事件处理程序的代码,如下所示:

private void CustomGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    foreach(DataGridCellInfo cellInfo in minorGrid.SelectedCells)  // For each selected cell
    {
        DataGridCell cell = GetDataGridCell(cellInfo); // get the cell
        string cellText = ((TextBlock)cell.Content).Text; // get the text of the cell
        if (cellText.ToLower().Contains("off"))  // If meets the conditino
            cell.IsSelected = false;  // unselect the cell           
    }
}

private DataGridCell GetCell(DataGridCellInfo cellInfo)
{
    var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
    if (cellContent != null)
        return (DataGridCell)cellContent.Parent;

    return null;
}

当选择了一个单元格,然后我们没有得到在了selectedCells列表中DataGridCell对象,但我们得到DataGridCellInfo对象。为了获得DataGridCell对象,我提供了一种方法。一旦获得单元对象,就可以在单元上执行逻辑。 这将从您选择的所有单元格中取消选择带有文本“ off”的单元格,这可能在假日:)。

但是,类似地,如果列标题包含“ saturday”或“ sunday”,则也可以根据命名列的方式取消选择整个列。只需更改以下几行

string cellText = ((TextBlock)cell.Content).Text; // get the text of the cell
if (cellText.ToLower().Contains("off"))  // If meets the conditino
    cell.IsSelected = false;  // unselect the cell 

string headerText = cell.Column.Header.ToString();
if (headerText.ToLower().Contains("saturday") || headerText.ToLower().Contains("sunday"))  // If meets the conditino
    cell.IsSelected = false;  // unselect the cell  

希望它会有所帮助:)