C# 插入后,UsedRange.RowCount不会更新

C# 插入后,UsedRange.RowCount不会更新,c#,spreadsheetgear,C#,Spreadsheetgear,我正在尝试编写一个扩展方法,将泛型项T添加到工作簿中,我遇到了问题,因为调用InsertMethod后UsedRange.RowCount没有增加 public static RowItem<T> AddItem<T>(this SpreadsheetGear.IWorksheet worksheet, T item) where T : class { int currentRow = worksheet.UsedRange.RowCou

我正在尝试编写一个扩展方法,将泛型项T添加到工作簿中,我遇到了问题,因为调用InsertMethod后UsedRange.RowCount没有增加

    public static RowItem<T> AddItem<T>(this SpreadsheetGear.IWorksheet worksheet, T item) where T : class
    {
        int currentRow = worksheet.UsedRange.RowCount;
        //int currentRow = worksheet.UsedRange.RowCount;
        RowItem<T> newItem = new RowItem<T>
        {
            Item = item,
            RowIndex = currentRow
        };

        var reflected = item.GetType().GetProperties();

        for (int i = 0; i < reflected.Length; i++)
        {
            object value = reflected[i].GetValue(item);
            worksheet.Cells[currentRow, i].Value = value;
        }

        worksheet.UsedRange.Insert(SpreadsheetGear.InsertShiftDirection.Down);
        worksheet.WorkbookSet.CalculateFull();

        return newItem;
    }

 public static IEnumerable<RowItem<T>> AddItems<T>(this SpreadsheetGear.IWorksheet worksheet, IEnumerable<T> items) where T : class
    {
        var lst = new List<RowItem<T>>();

        foreach (var item in items)
        {
            var newItem = AddItem<T>(worksheet, item);

            lst.Add(newItem);
        }

        return lst;
    }
我添加的项目如下所示

  using (var _ = new WorkbookViewLock(workbookView1))
  {
     var worksheet = workbookView1.ActiveSheet.Workbook.Worksheets[0];

     worksheet.AddItem<Dummy>(dummy);
     worksheet.AddItem<Dummy>(dummy2);
  }
使用(var=新WorkbookViewLock(workbookView1))
{
var worksheet=workbookView1.ActiveSheet.Workbook.Worksheets[0];
工作表.附加项(虚拟);
工作表.附件(dummy2);
}

如果您从一个空白工作表开始(是吗?),那么您对代码中的
工作表.UsedRange.RowCount
所做的前两项检查的值为1是有意义的

这是因为空白工作表的
UsedRange
始终为A1,这将对应于
UsedRange.RowCount
值1。这说明您的第一次
AddItem(…)
调用的值为1

第二个
AddItem(…)
调用现在正在查看一个填充了数据的工作表,但仍然只有一行,因为此时您只添加了一个
Dummy
对象

如果要添加第三个
Dummy
对象,您将看到
UsedRange
的值增加到2


仅供参考:您的
工作表.UsedRange.Insert(…)
行可能还有一个问题,因为这将插入
UsedRange
当前包含的行数。在我看来,如果使用此扩展方法只添加一个
Dummy
对象,则最多只能插入一行…这取决于您希望将每个新
Dummy
行添加到工作表的位置—所用范围的顶部或底部。如果要在
UsedRange
顶部插入新的
Dummy
对象,则只能在
UsedRange
的顶行应用
Insert(…)
。如果要在UsedRange底部插入新的
Dummy
对象,则根本不需要调用
Insert(…)
调用,因为UsedRange下面没有任何东西可以向下移动。

你好,Tim,我也在使用IEnumerable版本。。。事实上,我的第一行和第二行都有1,这对我来说是一个相当大的问题……我知道电子表格不知道当前绑定的项目,但我需要某种帮助来跟踪哪一行对应于我的源代码的哪一项。我认为您当前的代码/描述不够清晰,无法提供更详细的说明答复。例如,正如我在回答中提到的,您没有说明新行是位于
UsedRange
的顶部还是底部,而
Insert(…)
调用似乎并没有使这一点变得更清楚(您是否尝试运行上面的代码?)。无论如何,在我看来,您应该能够以某种方式解决currentRow==1问题,因为您不知道为什么会发生这种情况。我不能确切地说出你应该如何去做,因为关于总体需求的信息太少了。考虑一下这个场景:我从一个源获得一些数据,把它们放在一个列表中,我想重复它,并在每次通过一个步骤时添加一个电子表格。由于我需要在添加虚拟对象后更新其值单元格(假设DB上的值发生变化),所以我需要更新该特定单元格,以便我需要知道哪一行对应于哪一项,我理解这一点。然而,您最初的问题是为什么UsedRange.CurrentRow总是1。询问如何从本质上“同步”数据源和工作表数据是一个完全不同的问题,而不是一项简单的任务,尤其取决于您在工作表中插入这些数据的方式(即,由于新数据进入,现有数据行会移位,这可能会使您现有的数据行的ROUTITEM.ROWEQUEST值无效)。您可以考虑启动一个新的SO问题,提供更多关于特定需求和当前代码的信息。
  using (var _ = new WorkbookViewLock(workbookView1))
  {
     var worksheet = workbookView1.ActiveSheet.Workbook.Worksheets[0];

     worksheet.AddItem<Dummy>(dummy);
     worksheet.AddItem<Dummy>(dummy2);
  }