我在一个用户控件中使用一个listview,我将它数据绑定到页面加载事件中的一个对象列表。
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;
}
在我在listView周围添加一个updatepanel之前,这是完全正常的。
当我添加一个updatepanel时,表达式itemcommand处理程序仅每点击2次,尽管页面每次点击都会被回发。
在调试过程中,我可以看到每次单击“插入”按钮时都会输入页面的“加载”事件,但它只会每单击2次就命中表达式“项命令”。当itemcommand未被点击时,重置listview的内容。
我在这里闻到了视图状态问题,但我不知道如何解决它。
以下是标记的外观:
<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">
…
…
知道怎么解决这个问题吗?
圣彼得堡