如何使用C#使excel单元格只读?

如何使用C#使excel单元格只读?,c#,excel,ms-office,vsto,C#,Excel,Ms Office,Vsto,当我将AllowEdit属性设置为false时,编译错误将显示: 错误:属性或索引器 无法将“Microsoft.Office.Interop.Excel.Range.AllowEdit”分配给 --它是只读的 如何将单元格范围设置为只读 当我对这个范围使用验证时,我的CellContentChanged事件出现了一些异常 以下是CellContentChanged中的代码: Range range= (Range)this.workSheet.Cells[1,1]; range.AllowEd

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

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

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

当我对这个范围使用验证时,我的CellContentChanged事件出现了一些异常

以下是CellContentChanged中的代码:

Range range= (Range)this.workSheet.Cells[1,1];
range.AllowEdit = false;
var updater=新操作(
项目=>
{
var editem=_taskViewModel.TrackedItems.First(it=>it.Id==item.Id);
//在第行上方,我得到了类似“序列不包含匹配元素”的异常
editem.Update(项目);'
});

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

在c代码中可以做的是,在变量或列表中定义一个“只读”单元格,订阅SheetChange事件,在SheetChange事件中,如果该单元格发生更改,只需撤消该更改即可

示例 私有列表readOnlyCells=新列表()

更新

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

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

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

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

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

在我的代码中,我的名称空间中不存在“XlDVType”,请尝试使用Excel=Microsoft.Office.Interop.Excel添加此指令;我在我的应用程序中使用了你的代码。它限制编辑值,但它说的是类似“某些用户限制此值”的警报,在我取消警报框后,我在CellContentChanged事件中遇到了一些问题。。我现在怎么解决这个问题呢?首先,我建议你使用我建议的第一种方法。第二,请定义“一些问题”,您必须自己解决其余逻辑:)excel单元格可以设置为
只读
仅当您设置其属性
Locked=True
,然后设置
工作表=Protected
。我不知道用C代码是否容易,但你可以试试。我们能给出第一个工作表。保护(…),第二个范围。锁定=真吗?
changedCell.Validation.Add(Excel.XlDVType.xlValidateCustom, Type.Missing, Type.Missing, "\"\"");
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);