views:

496

answers:

1

Hello

I am using a Listview in a usercontrol that I databind to a list of object in the page load event.

protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            BindListViews();
        }

    private void BindListViews()
    {
        MyListView.DataSource = IncludeExpressions;            
        MyListView.DataBind();
    }

I need to handle inserting new items in the list. To do that, I added an InsertItemTemplate with a button that has "Insert" as command argument. I dont want to persist the data to the database until the user press the save button, at the bottom of the form. So in the ItemCommand event, Here is my code:

  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;
        }

This works perfectly fine until I add an UpdatePanel around the listview. When I add an updatepanel, the Expression_ItemCommand handler is hit only every 2 clicks, eventhough the page is post back every click. While debugging, I can see that I do enter the Page_Load event of the page at each click on the Insert button, but it hits the Expression_ItemCommand only every 2 clicks. and reset the content of my listview when the ItemCommand is not hit. I smell ViewState problems here, but I can't figure out how to fix it.

Here is what the markup looks like :

<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">

... ...

Any Idea how to solve this?

Stéphane

A: 

After looooong investigations and rebuilding of the page control by control, the reason was that the viewstate was compressed and the scriptmanager didnt like it somehow, even though I specify the hidden field to it.

Probleme solved...

Stephane