我目前正在开发一个DataGrid,它在某些情况下应该通过将IsReadOnly
更改为true来禁用或启用特定列,反之亦然。
我附加了CurrentCellChanged
和CellEditEnded
个事件,我在其中更改了列IsReadOnly
属性。
我希望应用程序禁用/启用该列的编辑。
即使列IsReadOnly
设置为true,有时它也允许编辑。
我也尝试在网格上调用CancelEdit();
,但这也没有产生任何影响。
如果你要求我可以发布代码,但我很确定逻辑是正常的,我在调试中检查了数千次;)。
整个想法只不过是在事件中更改特定列的IsReadOnly。
知道为什么它没有像我期望的那样工作吗?
EDIT1。 代码已添加。
private void SrfDataGrid_CurrentCellChanged(object sender, EventArgs e)
{
CellCoordinates cellCoordinates = this.GetEditedCellCoordinates();
if (!this.LockDataGridCell(cellCoordinates))
{
if (!Keyboard.Modifiers.HasFlag(ModifierKeys.Control) && !Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
this.srfDataGrid.BeginEdit();
}
else
{
this.srfDataGrid.CancelEdit();
}
}
private void SrfDataGrid_CellEditEnded(object sender, DataGridCellEditEndedEventArgs e)
{
CellCoordinates cellCoordinates = this.GetEditedCellCoordinates();
this.SetCellsRowInfluence(cellCoordinates);
this.UnlockDataGridCell(cellCoordinates);
}
public bool LockDataGridCell(CellCoordinates cellCoordinates)
{
bool result = false;
if (cellCoordinates != null)
{
DataGridColumn currentColumn = this.srfDataGrid.CurrentColumn;
if (this.spreadSheetCellState[cellCoordinates.ColumnName, cellCoordinates.RowID].Equals(CurrentCellState.WRITE))
{
currentColumn.IsReadOnly = false;
}
else
{
currentColumn.IsReadOnly = true;
}
result = currentColumn.IsReadOnly;
}
return result;
}
public void UnlockDataGridCell(CellCoordinates cellCoordinates)
{
if (cellCoordinates != null)
{
DataGridColumn currentColumn = this.srfDataGrid.CurrentColumn;
if (this.spreadSheetCellState[cellCoordinates.ColumnName, cellCoordinates.RowID].Equals(CurrentCellState.ALWAYS_READ_ONLY))
{
currentColumn.IsReadOnly = true;
}
else
{
currentColumn.IsReadOnly = false;
}
}
}
答案 0 :(得分:1)
试试这个:
foreach (DataGridColumn col in dataGrid1.Columns)
{
if (col.GetType() == typeof(DataGridTextColumn))
{
col.IsReadOnly = true;
}
else
{
col.IsReadOnly = false;
}
}