【问题标题】:Databound Listview in UpdatePanelUpdatePanel 中的数据绑定列表视图
【发布时间】:2009-11-23 14:01:00
【问题描述】:

我在用户控件中使用 Listview,我将其数据绑定到页面加载事件中的对象列表。

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 之前,这非常有效。 当我添加更新面板时,Expression_ItemCommand 处理程序仅每点击 2 次,即使页面每次点击都会回发。 在调试时,我可以看到我确实在每次单击插入按钮时输入了页面的 Page_Load 事件,但它仅在每 2 次单击时才命中 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">

... ...

有什么办法解决这个问题吗?

史蒂芬

【问题讨论】:

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


    【解决方案1】:

    经过长时间的调查和通过控件重建页面控件,原因是视图状态被压缩并且脚本管理器不喜欢它,即使我指定了隐藏字段。

    问题解决了……

    【讨论】:

    • 您能否详细说明您是如何解决该问题的?
    • 如果我记得的话,我们正在使用 base64 算法压缩视图状态。消除压缩使其工作。我禁用它并没有进一步挖掘,因为收益并不大。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多