本主题描述在从数据存储中加载 XtraGrid、XtraPivotGrid、XtraBars、XtraVerticalGrid、XtraTreeList 和 XtraNavBar 控件的布局时,可能会遇到的问题。
控制布局的加载
我们考虑一下下列情形。 假设你已经开发和部署了一个使用 DevExpress .NET 控件(XtraGrid、XtraPivotGrid、XtraBars 等) 的应用程序。 这个应用程序允许最终用户定制布局,并在应用程序运行期间保存。 当应用程序关闭时此布局被自动保存到一个 XML 文件,当应用程序启动时进行加载。 这样最终用户的布局参数被存储在了 XML 文件中。
这个应用程序逐步升级并实现了新的功能。 例如,添加了新列(在 XtraGrid 控件中)、新组(在 XtraNavBar 控件中),删除了原有的列等。 当最终用户启动新版本应用程序时,原有的布局参数被自动从 XML 文件中加载,这样,过时的布局却被应用到了新版本应用程序中。 结果是 —— 在该布局被加载之后,新增的列/组等被隐藏了起来。
为解决这样的问题,控件提供了两个事件:
- LayoutUpgrade
这个事件可以被接管,用于在布局已经从数据存储中加载并应用到控件之后,对控件的布局进行定制。
注意 LayoutUpgrade 事件仅在被加载的布局的 版本 与当前控件的布局不匹配时才会发生。 通过控件的 LayoutVersion 属性,版本可以被指派到控件布局中。 当布局被保存时,它的版本也会与所有必需的布局设置一起被保存。
当布局被从数据存储中加载时,它的版本与当前布局的版本进行比较。 如果版本不匹配,那么 LayoutUpgrade 事件被触发。 否则,这个事件不会发生。
在布局被加载之后,你可以接管 LayoutUpgrade 事件来执行所需的定制步骤。 例如,你可以在指定位置显示那些被添加到新版本应用程序中的列,或者隐藏一些其列。
- BeforeLoadLayout
在布局被从数据存储中加载、应用到控件之前,这个事件发生。 通过接管这个事件,可以阻止布局被应用。 例如如果版本不匹配,就可以取消布局的恢复。
布局加载的特殊事项 (XtraGrid、XtraPivotGrid)
XtraGrid 和 XtraPivotGrid 控件提供了控制如何保存布局到数据存储中、以及如何从数据存储中恢复布局的选项。 这些选项在 OptionsLayout 属性中进行组合。 包括:是否保存控件外观和 data-aware 设置的选项、可视性选项等。 另外,还有指定如何处理在所加载的布局中存在、但在当前控件布局中不存在的列/字段的选项。
缺省时,在当前控件中存在、但在所加载布局中不存在的列会被保留。 另外,在所加载布局中存在、但在当前控件布局中不存在的列会被销毁。 要改变这种行为,可使用 OptionsLayout 对象的 OptionsColumnLayout.AddNewColumns 和 OptionsColumnLayout.RemoveOldColumns 属性。