如何使用C#制作excel单元ReadOnly?

时间:2012-05-14 11:22:39

标签: c# excel ms-office vsto

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

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

  

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

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

当我在此范围内使用验证时,我的CellContentChanged事件会出现一些异常。

以下是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);'
           });

2 个答案:

答案 0 :(得分:3)

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

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

示例     private List 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, "\"\"");

使用它可以减少控制,单元格将不接受任何输入。

答案 1 :(得分: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);