保存 ASPxGridView 列宽数据
本文关键字:数据 ASPxGridView 保存 | 更新日期: 2023-09-27 17:55:47
我正在维护一个使用 DevExpress ASP.NET v13.2 控件的项目,其中我有一个显示各种信息的 ASPxGridView。最近,在对这个网格的布局进行一些工作时,我注意到根本没有保存列宽。似乎只存储了列顺序和列可见性。
这是我在客户端得到的:
<dxwgv:ASPxGridView ID="ASPxGridView" runat="server"
AutoGenerateColumns="False"
ClientInstanceName="grid"
KeyFieldName="ClientId"
Width="100%"
OnHtmlRowPrepared="ASPxGridView_HtmlRowPrepared"
OnCustomCallback="ASPxGridView_CustomCallback"
OnClientLayout="gridView_ClientLayout">
<SettingsBehavior ColumnResizeMode="NextColumn" AllowFocusedRow="True" />
<SettingsCookies Enabled="True"></SettingsCookies>
<SettingsText EmptyDataRow="No queries found for the current criteria." />
<Settings ShowFilterRow="True" ShowGroupPanel="True" ShowFilterRowMenu="True" GridLines="None" />
<ClientSideEvents BeginCallback="OnGridBeginCallback"
EndCallback="OnGridEndCallback"
ColumnResized="function(s, e) {
e.processOnServer = true;}">
</ClientSideEvents>
<Columns>
因此,根据上面的代码片段,每当调整列的大小时,都会在服务器端处理事件并将其发送到 girdView_ClientLayout 方法(这有效)。
以下是girdView_ClientLayout的外观:
protected void gridView_ClientLayout(object sender, ASPxClientLayoutArgs e)
{
//if in saving mode continue.
//compare GridView's current layout (e.LayoutData) info to that stored on Db for this user.
//if different, save new layout to Db.
//refresh layout, i.e. read new user layout from Db.
//otherwise ignore as to reduce unnecessary extra Db interaction.
}
因此,根据我的理解,e 应该包含一个名为 LayoutData 的属性,这是一个人类不可读的逻辑字符串,应该具有布局信息,例如可见的列、列顺序、分组、列宽等,只有 gridview 才能理解。但是,在逐步执行流程时,我注意到传递给gridView_ClientLayout的字符串没有列宽信息。我上面的方法忽略了新的布局信息,因为从技术上讲,它看不到布局数据的变化,因此不会保存布局!然后,它会刷新网格(从 DB 读取用户的布局),这意味着列宽将重置为 DB 中保存的任何列宽。
下面是调整宽度大小之前的布局数据字符串示例:
"page1|sort1|a20|conditions14|1|3|4|3|6|3|8|3|10|3|12|3|13|3|14|3|15|3|19|3|20|3|21|3|22|3|23|3|visible24|f0|f3|t0|f16|f2|f16|t1|f16|t6|f16|t7|f16|t4|t5|f10|f9|t11|t12|f14|f13|t8|f16|f13|f16|width24|e|e|60px|e|e|e|e|e|e|e|e|e|300px|e|e|e|e|e|e|e|e|e|e|e"
以下是在重新调整发生时将布局数据传递给girdView_ClientLayout的样子:
"page1|sort1|a20|conditions14|1|3|4|3|6|3|8|3|10|3|12|3|13|3|14|3|15|3|19|3|20|3|21|3|22|3|23|3|visible24|f0|f3|t0|f16|f2|f16|t1|f16|t6|f16|t7|f16|t4|t5|f10|f9|t11|t12|f14|f13|t8|f16|f13|f16|width24|e|e|60px|e|e|e|e|e|e|e|e|e|300px|e|e|e|e|e|e|e|e|e|e|e"
一模一样!我期待类似于上面的字符串,但有更多以 px 结尾的部分。有点像:
'page1|visible23|f0|f-1|t0|f1|f-1|f2|t1|f3|f4|f4|t3|f5|t2|f6|f6|f6|t4|f7|f11|f7|t5|t6|f8|width23|e|200px|100px|e|e|e|56px|e|e|e|150px|e|200px|e|e|e|200px|e|e|e|120px|128px|e'
(请注意以px结尾的各种随机部分)如果我在 Db 中手动编辑这些 px 部分并运行应用程序,则列的大小会相应调整,因此从网格中保存而不是加载到网格中绝对是一个问题。
我计划尽快放弃保存/加载这个人类不可读的网格视图布局字符串,因为每当客户需要新列时,它都会让我头疼。我将很快实现一个XML替代方案,但即便如此,它也需要不存储在ASPxClientLayoutArgs.LayoutData中的列宽信息,这意味着我必须实现一个肮脏的黑客来将此列宽信息注入XML结构。但这是另一天的问题。
有人有什么建议吗?这不是一个大问题,我的意思是它只是列宽,但我的 Scrum Master 真的很希望它包含在我们的下一个部署中(这个问题被推迟了)。他是一个非常酷的人,我真的很不想用这么小和微不足道的东西让他失望。
谢谢大家,让-皮埃尔
我设法找到了一些不推荐使用的代码,这些代码与网格视图的布局功能有关。