我正在使用VSTO在Excel中创建ListObject,如下所示:
ListObject lo = ws_vsto.Controls.AddListObject(range, "MyList");
(范围变量是先前定义的范围。)
如果我循环遍历工作表Controls集合,我可以找到ListObject。
但是,如果我保存工作簿并重新打开它,则Controls集合为空。重新打开后如何恢复此ListObject,以便我可以继续使用它?
修改
我还有一点:
var wb = Globals.ThisAddIn.Application.ActiveWorkbook;
var wb_vsto = wb.GetVstoObject();
foreach (Excel.Worksheet ws in wb.Worksheets)
{
var wsv = ws.GetVstoObject();
foreach (Excel.ListObject l in ws.ListObjects)
{
MessageBox.Show(l.Name);
var lo = wsv.Controls.AddListObject(l);
Excel.Range range = lo.Range;
range.Activate();
}
}
当我到达var lo = line时,我将一个ListObject添加到Controls集合中并可供使用。但是,它的DataSource属性保持为null。是否有一种简单的方法可以恢复原始数据源?
然后我考虑从范围内的信息重建数据源。 range.Activate()行选择Excel中的列表(所以我知道它有正确的事情)。但是,我不能为我的生活弄清楚如何从该范围中获取数据并获得范围的地址。 MSDN文档讨论了Address属性,但这似乎并不存在。 (VSTO的MSDN文档充其量似乎很苛刻)。
答案 0 :(得分:4)
我对初始代码进行了以下更改。你需要从工厂获得一个VSTO Listobject。
var wb = Globals.ThisAddIn.Application.ActiveWorkbook;
var wb_vsto = wb.GetVstoObject();
foreach (Excel.Worksheet ws in wb.Worksheets)
{
var wsv = ws.GetVstoObject();
foreach (Excel.ListObject l in ws.ListObjects)
{
MessageBox.Show(l.Name);
//var lo = wsv.Controls.AddListObject(l);
Microsoft.Office.Tools.Excel.ListObject lo =
Globals.Factory.GetVstoObject(l);
// I can now get at the datasource if neede
var ds = lo.DataSource;
// In my case the datasource was DataTable.
DataTable t = (DataTable)d;
if (t.Rows.Count > 0)
{
foreach (DataRow r in t.Rows)
{
// Access row data.
}
}
//Excel.Range range = lo.Range;
//range.Activate();
}
}
答案 1 :(得分:1)
从MSDN GetVstoObject开始,请务必阅读备注。
答案 2 :(得分:1)
关于你的第一个问题, 您使用代码
创建了listOjectListObject lo = ws_vsto.Controls.AddListObject(range, "MyList");
要在保存/重新打开工作簿后恢复对象,请尝试以下代码:
ListObject lo = Globals.Factory.GetVstoObject(Worksheet.ListObjects["MyList"]);
答案 3 :(得分:0)
您根本无法获取在运行时动态创建的ListObject控件。这来自MSDN documentation。
默认情况下,动态创建的列表对象不会保留在 工作表关闭时,工作表作为主机控件。
我可以取回ListObject的唯一方法是在设计时直接在模板的表格中创建它们。