我有datagrid wpf和选项:
SelectionUnit="Cell"
SelectionMode="Extended"
Datagrid有10列。我需要的是仅选择例如1-4和8-10列 - 当我将鼠标指针拖到所有数据网格单元格上时,跳过5-7列。是否有可能做到这一点?我尝试提升 SelectedCellsChanged 事件并从 DataGrid.SelectedCells 中删除项目,但后来我遇到异常:
此集合不支持使用特定索引更改值。
更多信息:我的表格有10列x n行。所有列都带有文本值。行代表员工。列表示天数 - 其中一些是星期六/星期日,而不是工作日。行和列中的单元格值可以相同。我希望有可能通过在数据网格上拖动鼠标指针来选择所有单元格,但是跳过这些星期六/星期日的选择,它们可以位于列的中间。
答案 0 :(得分:0)
您可以使用单元格的索引选择特定列的所有单元格 并使用System.Collections.Generic.IList和System.Collections.Generic.KeyValuePair
了解更多信息:
答案 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
希望它会有所帮助:)