Я поддерживаю проект, который использует элементы управления DevExpress ASP.NET v13.2, и внутри него у меня есть ASPxGridView, который отображает все виды информации. Недавно, проделав некоторую работу над компоновкой этой сетки, я заметил, что ширины столбцов вообще не сохраняются. Кажется, что хранится только упорядочение столбцов и видимость столбцов.Сохранение данных ширины столбца 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.
}
Так, по моему пониманию, е должен содержать свойство 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, когда происходит rezising:
"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'
(Обратите внимание на различные случайные секции, оканчивающиеся на рх) Если я вручную редактировать эти секции точек в Дб и запустить приложение, столбцы размера соответственно, так что это, безусловно, проблема сохранения из сетки, не загружая на нее.
Я планирую скорое сохранение/загрузку этой человеческой нечитаемой строки макета gridview, поскольку это давало мне много головных болей, когда клиенты хотят новых столбцов. Я скоро буду внедрять альтернативу XML, но даже тогда она также требует информации ширины столбца, которая не хранится в ASPxClientLayoutArgs.LayoutData, что означает, что мне придется реализовать грязный взломать, чтобы ввести эту информацию ширины столбца в структуру XML. Но это проблема еще на один день.
У кого-нибудь есть предложения? Это не огромная проблема, я имею в виду, что это просто ширина столбца, но мой мастер схватки действительно хотел бы включить его в наше следующее развертывание (которое откладывается этой проблемой). Он очень классный парень, и я действительно ненавижу разочаровывать его чем-то таким маленьким и несущественным.
Спасибо, ребята, Jean-Pierre