Nested RadListView With LinkButton Command Doesn't Refresh

6 posts, 0 answers
  1. Brian Pautsch
    Brian Pautsch avatar
    15 posts
    Member since:
    Jun 2009

    Posted 01 May 2012 Link to this post

    I have a RadListView nested within a RadListView. The inner RadListView has LinkButtons for copying/deleting/organizing the elements. When the LinkButtons are clicked, the events fire and I copy/delete/reorganize the data, but the page doesn't get updated. If I refresh the page or execute another command, the data is refreshed...but it's always one click behind. It's obviously an event sequence and after lots of searching it sounds like I need to use the AjaxManager. I've been wresting with this too long and need help.

    ASPX
    I included surrounding controls just in case this affected the solution. The issues I'm having are with rlvGroups,

    <telerik:RadMultiPage ID="rmpTabs" runat="server" SelectedIndex="0" Width="100%">
        <telerik:RadPageView ID="rpv1" runat="server">
            Page title: <asp:TextBox ID="txtTitle" runat="server"></asp:TextBox>
        </telerik:RadPageView>
        <telerik:RadPageView ID="rpv2" runat="server">
            <asp:Panel ID="pnlNotRelevant" runat="server">
            </asp:Panel>
        </telerik:RadPageView>
        <telerik:RadPageView ID="rpv4" runat="server">
            <asp:Panel ID="pnlItems" runat="server">
                <telerik:RadListView ID="rlvGroups" runat="server" OnItemDataBound="rlvGroups_ItemDataBound"
                    Width="100%">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "Name")%>
                        <br />
                        <telerik:RadListView ID="rlvItems" runat="server" OnItemDataBound="rlvItems_ItemDataBound"
                            Width="100%">
                            <ItemTemplate>
                                <%# DataBinder.Eval(Container.DataItem, "Title")%>
                                <asp:LinkButton ID="lbUp" runat="server" OnCommand="lbUp_Command"><img src="arrow-up.png" /></asp:LinkButton>
                                <asp:LinkButton ID="lbDown" runat="server" OnCommand="lbDown_Command"><img src="arrow-down.png" /></asp:LinkButton>
                                <asp:LinkButton ID="lbEdit" runat="server" OnCommand="lbEdit_Command"><img src="edit.jpg" /></asp:LinkButton>
                                <asp:LinkButton ID="lbCopy" runat="server" OnCommand="lbCopy_Command"><img src="copy.jpg" /></asp:LinkButton>
                                <asp:LinkButton ID="lbDelete" runat="server" OnCommand="lbDelete_Command"><img src="delete.png" /></asp:LinkButton>
                            </ItemTemplate>
                        </telerik:RadListView>
                        <asp:LinkButton ID="lbAddPage" runat="server" Text="Add Page" OnCommand="lbAddPage_Command" />
                        <br />
                        <br />
                    </ItemTemplate>
                </telerik:RadListView>
                <asp:LinkButton ID="lbAddGroup" runat="server" Text="Add Group" OnCommand="lbAddGroup_Command" />
            </asp:Panel>
        </telerik:RadPageView>
    </telerik:RadMultiPage>

    C#
    Data is loaded from custom classes:
    private void RefreshGroupsItems()
    {
        rlvGroups.DataSource = tab.ViewX.Groups.Group;
        rlvGroups.DataBind();
    }

    protected void rlvGroups_ItemDataBound(object sender, RadListViewItemEventArgs e)
    {
        if (e.Item.ItemType == RadListViewItemType.DataItem || e.Item.ItemType == RadListViewItemType.AlternatingItem)
        {
            //Get datarow
            Group group = (Group)(((RadListViewDataItem)e.Item).DataItem);

            //Find controls
            RadListView rlvItems = (RadListView)e.Item.FindControl("rlvItems");
            LinkButton lbAddPage = (LinkButton)e.Item.FindControl("lbAddPage");

            //Populate controls
            List<ListItem> data = DataHelpers.BuildListItem(group);
            rlvItems.DataSource = data;
            rlvItems.DataBind();
            lbAddPage.CommandArgument = group.ID.ToString();
        }
    }

    protected void rlvItems_ItemDataBound(object sender, RadListViewItemEventArgs e)
    {
        if (e.Item.ItemType == RadListViewItemType.DataItem || e.Item.ItemType == RadListViewItemType.AlternatingItem)
        {
            //Get datarow
            ListItem item = (ListItem)(((RadListViewDataItem)e.Item).DataItem);

            //Find controls
            LinkButton lbUp = (LinkButton)e.Item.FindControl("lbUp");
            LinkButton lbDown = (LinkButton)e.Item.FindControl("lbDown");
            LinkButton lbEdit = (LinkButton)e.Item.FindControl("lbEdit");
            LinkButton lbCopy = (LinkButton)e.Item.FindControl("lbCopy");
            LinkButton lbDelete = (LinkButton)e.Item.FindControl("lbDelete");

            //Populate controls
            lbUp.CommandArgument = item.ID.ToString();
            lbDown.CommandArgument = item.ID.ToString();
            lbEdit.CommandArgument = item.ID.ToString();
            lbCopy.CommandArgument = item.ID.ToString();
            lbDelete.CommandArgument = item.ID.ToString();
        }
    }

    Please help!
  2. Brian Pautsch
    Brian Pautsch avatar
    15 posts
    Member since:
    Jun 2009

    Posted 01 May 2012 Link to this post

    I did more research...do I need to get rid of the simple databinding and implement advanced data binding with the "NeedDataSource" method? If so, will that do it or do I need to add AjaxManager entries? And finally, would you recommend another approach with different controls? This is very close...just a refreshing issue.
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. Brian Pautsch
    Brian Pautsch avatar
    15 posts
    Member since:
    Jun 2009

    Posted 02 May 2012 Link to this post

    I changed the outer ListView to:
    <telerik:RadListView ID="rlvGroups" runat="server" OnNeedDataSource="rlvGroups_NeedDataSource" OnItemDataBound="rlvGroups_ItemDataBound">

    and added the event. The page renders as it did before...no issues...but when I execute a command (click a linkbutton in the inner ListView), the page still doesn't refresh. I am calling "rlvGroups.Rebind();" after the command is processed.

    Any ideas? Do I need to use the AjaxManager?
  5. Andrey
    Admin
    Andrey avatar
    836 posts

    Posted 07 May 2012 Link to this post

    Hi,

    Most probably the behavior you are experiencing is caused by databinding problem. In this case I do not think that RadAjaxManager will help, it is used to Ajax-ify(partially update control on the page) a solution which is already working as expected.

    Could you post your entire code-behind along with the rest of the mark-up code? Thus I will better understand your scenario.

    Regards,
    Andrey
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  6. Brian Pautsch
    Brian Pautsch avatar
    15 posts
    Member since:
    Jun 2009

    Posted 07 May 2012 Link to this post

    I should have replied last Friday...I figured it out.
    The problem was that the ReBind() method DOES NOT always call NeedDataSource!
    In order to get it to call, I had to do this:

    rlvGroups.DataSource = null;
    rlvGroups.Rebind();

    Is this a bug? Working as designed?
  7. Andrey
    Admin
    Andrey avatar
    836 posts

    Posted 08 May 2012 Link to this post

    Hi,

    Yes, that was my next suggestion.

    This is an expected behavior, RadGrid by itself decides when to fire the NeedDataSource event, this is true because RadGrid cache its datasource for performance optimizations. There is no need to fetch the data from the server over and over again if there is no change in the data.

    And as you found out in order to force it to fire the event you should set the datasource as null outside of the event.

    I hope this helps.

    Greetings,
    Andrey
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
Back to Top
UI for ASP.NET Ajax is Ready for VS 2017