我有一个以编程方式创建的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>