Excel listObject不会在工作表中显示更新的值。更改事件

时间:2017-07-05 17:27:21

标签: c# excel events vsto excel-2016

我有一个以编程方式创建的excel表,它使用List<Object>作为数据源。我创建此表是通过使用Tools.Worksheet ListObject添加AddListObject(),然后使用listObject.DataSource分配List<Object>。表格已经创建并且工作正常,用户可以编辑表格中的任何单元格/行。

我正在使用WorkSheet.Change事件处理修改。当用户编辑属于某个表的单元格时,会触发worksheet.Change事件(通过在Change事件处理程序中设置断点来验证)。

我正在使用发送到Change事件处理程序的目标访问table / listObject,然后我使用Factory.GetVstoObject(target.ListObject)来获取Tools.ListObject。到目前为止一切正常。

问题:

当我访问ListObject.DataSource时,我发现dataSource中的值更新了新值。我需要workSheet.Change事件中的这个新值来做一些验证和其他事情。为什么我没有在Change事件处理程序中看到更新的值?在到达WorkSheet.Change事件处理程序之前,应将DataSource值更新为新值?有没有办法解决这个问题或有没有其他方法来获取table / listObject的新值?

PS:执行更改事件处理程序后,如果用户再次编辑,我会看到listObject.DataSource中的第一个编辑值(非第二个编辑值)。我也尝试了ListObject.Change事件,仍然看到旧值。

这里是代码: 这就是我创建新工作表的方式。

public static Worksheet CreateNewExcelSheet(string sheetName)
{
    var newWorksheet = (Worksheet)Globals.ThisAddIn.Application.Worksheets.Add();
    newWorksheet.Name = sheetName;
    newWorksheet.Activate();
    newWorksheet.Change += WorkSheetChange_EventHandler;
    newWorksheet.CustomProperties.Add(IsTableSelected, "false");
    return newWorksheet;
}

创建listobject的代码:

public static Tools.ListObject CreateListObject(Worksheet workSheet, Range startingPosition, string listObjectName)
{
    var vstoWorkSheetObject = GetVstoWorkSheetObject(workSheet);
    var listObject = 
    vstoWorkSheetObject.Controls.AddListObject(startingPosition, listObjectName);
    listObject.Deselected += ListObject_Deselected;
    listObject.Selected += ListObjectOnSelected;
    listObject.Change += ListObject_Change;
    listObject.DataBindings.Clear();
    listObject.TableStyle = TableStyle;
    return listObject;
}

主要代码:

private void CreateTable(string sheetName, string listObjectName)
{
    var workSheet = CreateNewExcelSheet(sheetName);
    var listObject = CreateListObject(workSheet, Globals.ThisAddIn.Application.Range["A4"], listObjectName);
    listObject.SetDataBinding(dataSourceFromServer);
    var counter = 0;
    foreach (Range cell in listObject.HeaderRowRange.Cells)
    {
        cell.Value2 = ColumnNames[counter];
        counter++;
    }
    listObject.HeaderRowRange.EntireColumn.AutoFit();
}

dataSourceFromServer的类型为List<Object>

0 个答案:

没有答案