保存ASPxGridView列宽数据

时间:2015-06-12 09:51:52

标签: c# asp.net layout devexpress aspxgridview

我正在维护一个使用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中保存的任何内容。

以下是调整宽度大小之前LayoutData字符串的示例:

"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"

以下是在重新确定时,LayoutData看起来像传递给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部分并运行应用程序,那么列的大小会相应地调整,因此从网格中保存它并不会加载到网格中。

我计划放弃保存/加载这个人类不可读的gridview布局字符串,因为当客户需要新列时,它会给我带来很多麻烦。我很快就会实现XML替代方案,但即便如此,它也需要没有存储在ASPxClientLayoutArgs.LayoutData中的列宽信息,这意味着我必须实现一个脏的hack来将这个列宽信息注入到XML中结构体。但那是另一天的问题。

有人有什么建议吗?这不是一个大问题,我的意思是它只是列宽,但我的scrum master真的很喜欢它包含在我们的下一个部署中(由于这个问题而被延迟)。他是一个非常酷的家伙,我真的很讨厌用一些如此小而微不足道的东西让他失望。

谢谢你们, 让 - 皮埃尔

1 个答案:

答案 0 :(得分:0)

我设法找到一些不熟悉的代码,这些代码与gridview的布局功能紧密相关。