7
Range range= (Range)this.workSheet.Cells[1,1];
range.AllowEdit = false;

当我将该AllowEdit属性设置为 false 时,将显示编译错误:

错误:无法将属性或索引器“Microsoft.Office.Interop.Excel.Range.AllowEdit”分配给——它是只读的

如何将单元格范围设置为只读?

当我对此范围使用验证时,我的 CellContentChanged Event 出现了一些异常。

这是 CellContentChanged 中的代码:

   var updater = new Action<StyleColorItem>(
           item =>
           {
              var editedItem = _taskViewModel.TrackedItems.First(it => it.Id == item.Id); 
            // Above line I am getting the exception like "Sequence contains no matching element"
               editedItem.Update(item);'
           });
4

2 回答 2

4

无法在 Excel 中将单元格设为只读。

您可以在 C# 代码中执行的操作是,在变量或列表中定义一个“只读”单元格,订阅 SheetChange 事件,在 SheetChange 事件中,如果该单元格被更改,只需撤消改变。

示例 私有列表 readOnlyCells = new List();

private void OnActiveSheetCellChange(object changedSheet, Excel.Range changedCell)
{
  if (readOnlyCells.Contains(changedCell))
      changedCell.Value = string.Empty;
      //.... YOUR CODE

更新

另一种选择是使用数据验证:

changedCell.Validation.Add(Excel.XlDVType.xlValidateCustom, Type.Missing, Type.Missing, "\"\"");

使用它,您将拥有更少的控制权,并且单元格将根本不接受任何输入。

于 2012-05-14T12:10:40.130 回答
1

我认为可以通过将Locked属性设置为 true 并保护工作表来完成。

range.Locked = true;
this.workSheet.Protect(Type.Missing, Type.Missing,
                       true,
                       Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                       Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                       Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                       Type.Missing);
于 2012-05-14T13:03:34.757 回答