2009-11-23 29 views
0

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

... ...

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

斯特凡

回答

0

一长串的调查和控制,页面控制的改造后,其原因是,视图状态被压缩和的ScriptManager不喜欢它在某种程度上,即使我指定的隐藏字段它。

问题解决了...

+0

请问您可以发表更多关于您如何解决问题的细节? – 2011-04-29 19:06:13

+0

如果我记得,我们正在使用base64算法压缩viewstate。删除压缩使它工作。我禁用了它,并没有进一步挖掘,因为收益并不大。 – 2011-05-12 09:00:02