【问题标题】:How to make an excel cell ReadOnly using C#?如何使用 C# 使 Excel 单元格只读?
【发布时间】:2012-05-14 11:22:38
【问题描述】:
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);'
           });

【问题讨论】:

  • 一个excel单元格可以设置为read only,只有你设置它的属性Locked=True,然后设置WorkSheet=Protected。我不知道用 C# 代码是否容易做到,但你可以试试。

标签: c# excel ms-office vsto


【解决方案1】:

在 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, "\"\"");

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

【讨论】:

  • 在我的代码中说我的命名空间中不存在“XlDVType”
  • 尝试使用 Excel 添加这个 using 指令 ​​= Microsoft.Office.Interop.Excel;
  • 我在我的应用程序中使用了你的代码。它限制编辑值,但它说像“某些用户限制这个值”这样的警报,在我取消那个警报框后,我的 CellContentChanged 事件出现了一些问题.. 我现在该如何解决这个问题?
  • 好吧,首先,我建议你使用我建议的第一种方法。其次,请定义“一些问题”
  • 你必须自己弄清楚其余的逻辑:)
【解决方案2】:

我认为可以通过将 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);

【讨论】:

  • 我们可以给第一个 Worksheet.Protect(...) 和第二个我们可以给 Range.locked=true 吗?
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2011-12-05
  • 2019-07-26
相关资源
最近更新 更多