我正在维护一个使用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真的很喜欢它包含在我们的下一个部署中(由于这个问题而被延迟)。他是一个非常酷的家伙,我真的很讨厌用一些如此小而微不足道的东西让他失望。
谢谢你们, 让 - 皮埃尔
答案 0 :(得分:0)
我设法找到一些不熟悉的代码,这些代码与gridview的布局功能紧密相关。