保存 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 真的很希望它包含在我们的下一个部署中(这个问题被推迟了)。他是一个非常酷的人,我真的很不想用这么小和微不足道的东西让他失望。

谢谢大家,让-皮埃尔

保存 ASPxGridView 列宽数据

我设法找到了一些不推荐使用的代码,这些代码与网格视图的布局功能有关。