代码之家  ›  专栏  ›  技术社区  ›  Stéphane

UpdatePanel中的数据绑定ListView

  •  0
  • Stéphane  · 技术社区  · 16 年前

    我在一个用户控件中使用一个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">
    

    … …

    知道怎么解决这个问题吗?

    圣彼得堡

    1 回复  |  直到 15 年前
        1
  •  0
  •   Stéphane    16 年前

    在loooong调查并通过控件重新构建页面控件之后,原因是视图状态被压缩,而脚本管理器不喜欢它,尽管我指定了隐藏字段。

    问题解决了…

    推荐文章