我正在开发Excel 2010模板项目。在我的模板中,我有很多工作表,每个工作表中都有静态ListObject
控件。要初始化我的ListObject
,我绑定BindingList<MyCustomType>
,以便为我的每个MyCustomType
公共属性生成一列。这非常方便,因为当用户在ListObject
中的某些行时,它会自动填满我的BindingList
实例。我在Excel功能区中添加了一个按钮,以便程序可以通过EDM验证和提交这些行。这就是我将数据绑定到Excel表格的启动事件处理程序中的ListObject的方法。
public partial class MyCustomTypesSheet
{
private BindingList<MyCustomType> myCustomTypes;
private void OnStartup(object sender, System.EventArgs e)
{
ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData;
BindingList<MyCustomType> customTypes = new BindingList<MyCustomType>();
myCustomTypeTable.SetDataBinding(customTypes);
}
// Implementation detail...
}
现在我的问题是,此模板的用户很可能会在许多会话中输入这些行。这意味着他将输入数据,保存文件,关闭它,重新打开它,输入一些新行,并在他认为完成后最终尝试提交这些行。我注意到,当重新打开从模板创建的Excel文件时,我的ListObject控件的DataSource属性为null。这意味着我无法将ListObject
中的数据恢复为BindingList<MyCustomType>
。我一直在搜索,我发现没有自动的方法来做到这一点,我真的不想制作一段代码来抓取所有列来重新创建我的MyCustomType
实例。在一个理想的世界里,我会这样做。
private void OnStartup(object sender, System.EventArgs e)
{
ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData;
BindingList<MyCustomType> customTypes = null;
if (myCustomTypeTable.DataSource == null) // Will always be null and erase previous data.
{
customTypes = new BindingList<MyCustomType>();
myCustomTypeTable.SetDataBinding(customTypes);
}
else
{
customTypes = myCustomTypeTable.DataSource as BindingList<MyCustomType>;
}
}
我一直在对此进行大量研究,但我无法找到解决方案,所以我希望你们中的一些可以帮我解决这个问题。
感谢。
答案 0 :(得分:2)
作为最后一个解决方案,我决定用XML序列化我的对象列表,然后在保存时将它作为XML自定义部件添加到我的Excel文件中。但是当我进入MSDN文档来实现这一点时,我发现有两种方法可以持久保存数据:XML自定义部分和数据缓存。实际上,数据缓存正是我正在寻找的功能。
所以我只需使用CachedAttribute即可实现我的目标。
public partial class MyCustomTypesSheet
{
[Cached]
public BindingList<MyCustomType> MyCustomTypesDataSource { get; set; }
private void OnStartup(object sender, System.EventArgs e)
{
ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData;
if (this.MyCustomTypesDataSource == null)
{
this.MyCustomTypesDataSource = new BindingList<MyCustomType>();
this.MyCustomTypesDataSource.Add(new MyCustomType());
}
myCustomTypeTable.SetDataBinding(this.MyCustomTypesDataSource);
}
private void InternalStartup()
{
this.Startup += new System.EventHandler(OnStartup);
}
}
它就像一个魅力。您可以在MSDN documentation中找到有关数据缓存的更多信息。