我在用户控件中使用了一个ListView,该数据绑定到页面加载事件中的对象列表。UpdatePanel中的数据绑定列表视图
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
BindListViews();
}
private void BindListViews()
{
MyListView.DataSource = IncludeExpressions;
MyListView.DataBind();
}
我需要处理在列表中插入新项目。 为此,我添加了一个InsertItemTemplate,其中包含一个具有“Insert”作为命令参数的按钮。 我不想将数据保存到数据库中,直到用户按下表单底部的保存按钮。 所以在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周围的列表视图这工作完全正常。 当我添加一个updatepanel时,Expression_ItemCommand处理程序每2次点击就会被点击一次,尽管该页面每次点击都会回发。 在调试过程中,我可以看到每次点击Insert按钮时都会输入页面的Page_Load事件,但每次点击都会触发Expression_ItemCommand。并在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">
... ...
任何想法如何解决这个问题?
斯特凡
请问您可以发表更多关于您如何解决问题的细节? – 2011-04-29 19:06:13
如果我记得,我们正在使用base64算法压缩viewstate。删除压缩使它工作。我禁用了它,并没有进一步挖掘,因为收益并不大。 – 2011-05-12 09:00:02