Я использую Listview в usercontrol, который я привязываю к списку объектов в событии загрузки страницы.Databound Listview в UpdatePanel
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
BindListViews();
}
private void BindListViews()
{
MyListView.DataSource = IncludeExpressions;
MyListView.DataBind();
}
Мне нужно обработать вставку новых элементов в список. Для этого я добавил InsertItemTemplate с кнопкой «Вставить» в качестве аргумента команды. Я не хочу сохранять данные в базе данных до тех пор, пока пользователь не нажмет кнопку сохранения в нижней части формы. Таким образом, в случае ItemCommand, Вот мой код:
protected void Expression_ItemCommand(object sender, ListViewCommandEventArgs e)
{
var listView = (sender as ListView);
var expressions = GetExpressions(listView);
var newExpression = new Expression
{
CaseSensitive = ((CheckBox)e.Item.FindControl("CaseSensitiveCheckBox")).Checked,
SearchText = ((TextBox)e.Item.FindControl("SearchTextTextBox")).Text,
Scope = (Scope)Enum.Parse(typeof(Scope), ((DropDownList)e.Item.FindControl("ScopeDropDownList")).SelectedValue, true),
Type = (Type)Enum.Parse(typeof(Type), ((DropDownList)e.Item.FindControl("TypeDropDownList")).SelectedValue, true),
};
expressions.Add(newExpression);
listView.DataSource = expressions;
listView.DataBind();
UpdatePanelInclude.Update();
}
private List<Expression> GetExpressions(ListView lv)
{
var expressions = new List<Expression>();
foreach (var row in lv.Items)
{
var searchText = ((TextBox)row.FindControl("SearchTextTextBox")).Text;
...
expressions.Add(new Expression
{
CaseSensitive = caseSensitive,
Scope = scope,
Type = type,
SearchText = searchText
});
}
return expressions;
}
Это работает прекрасно, пока я не добавить UpdatePanel вокруг ListView. Когда я добавляю обновленную панель, обработчик Expression_ItemCommand попадает только каждые 2 клика, в то время как страница возвращается после каждого щелчка. Во время отладки я вижу, что я ввожу событие Page_Load страницы при каждом нажатии кнопки «Вставить», но попадает в Expression_ItemCommand только каждые 2 клика. и сбросить содержимое моего списка, когда ItemCommand не попал. У меня проблемы с ViewState здесь, но я не могу понять, как это исправить.
Вот что разметка выглядит следующим образом:
<asp:UpdatePanel ID="UpdatePanelInclude" UpdateMode="Conditional" ChildrenAsTriggers="true" runat="server">
<asp:ListView ID="MyListView" OnItemCommand="Expression_ItemCommand" OnItemInserting="ExpressionInserting" OnDataBinding="ListViewDataBinding" InsertItemPosition="LastItem" runat="server" ItemPlaceholderID="itemPlaceHolder">
... ...
Любая идея, как решить эту проблему?
Stéphane
Не могли бы вы предоставить более подробную информацию о том, как вы решили проблему? – 2011-04-29 19:06:13
мы сжимали viewstate, используя алгоритм base64, если я помню. Удаление компрессии заставило его работать. Я отключил его и не копал дальше, потому что выигрыш не был таким большим. –