UpdatePanel中的数据绑定列表视图

时间:2009-11-23 14:01:01

标签: asp.net data-binding listview asp.net-ajax updatepanel

我在usercontrol中使用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时,Expression_ItemCommand处理程序仅在每次点击2次时被点击,尽管每次点击都会回发页面。 在调试时,我可以看到每次单击“插入”按钮时都会输入页面的Page_Load事件,但只有每两次点击就会触及Expression_ItemCommand。未命中ItemCommand时重置listview的内容。 我在这里闻到了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">

... ...   

任何想法如何解决这个问题?

斯特凡

1 个答案:

答案 0 :(得分:0)

在通过控制进行looooong调查和重建页面控件之后,原因是视图状态被压缩并且脚本管理器不知何故不喜欢它,即使我为其指定了隐藏字段。

问题解决了......