Changing nested FormView.FormViewMode on all rows except the clicked one

2 posts, 0 answers
  1. Massimiliano
    Massimiliano avatar
    185 posts
    Member since:
    Oct 2012

    Posted 08 Nov 2013 Link to this post

    What I'm trying to accomplish is quite simple but I still didn't grasp all the ways of iterating the grid items in all the events.
    I have a grid with a custom FormView inside <NestedViewTemplate> (well the FormView really is inside a user control in <NestedViewTemplate>).

    What I would like to happen in the gui is this: when you click on the edit button (wich triggers a custom edit logic) I would like to check all OTHER rows to see if:
    1) they are expanded (and in this case collapse them so that only the active edited row is expanded)
    2) set the FormView.FormViewMode of each row OTHER than the edited one to ReadOnly so that if the user opens the row again in a later moment he finds it in view mode and no more in edit mode.
    3) set the <asp:Panel runat="server" ID="RadGrid1DetailContainer" CssClass="RadGridDetailContainer" Visible="true">, wich is the first item in the <NestedViewTemplate> to visible = false for all the row OTHER than the edited one

    The expand part is easy, and the custom logic wich expands the edited row and sets the FormView in edit mode is easy but I cannot find a way to address points 2 and 3.

    Here is my logic so far that triggers in RadGrid1_ItemCommand when user clicks on the edit button and throws the EditFormView command. 

    ASPX part:

    <NestedViewTemplate>
        <asp:Panel runat="server" ID="RadGrid1DetailContainer" CssClass="RadGridDetailContainer" Visible="true">
            <telerik:RadTabStrip runat="server" ID="RadGrid1DetailTabStrip" MultiPageID="RadGrid1DetailMultipage1" SelectedIndex="0" CssClass="RadGridTabStrip">
                <Tabs>
                    <telerik:RadTab runat="server" Text="Dati utente" PageViewID="RadGrid1DetailRadPageView1">
                    </telerik:RadTab>
                    <telerik:RadTab runat="server" Text="Anagrafica" PageViewID="RadGrid1DetailRadPageView2">
                    </telerik:RadTab>
                    <telerik:RadTab runat="server" Text="Altri dati" PageViewID="RadGrid1DetailRadPageView3">
                    </telerik:RadTab>
                </Tabs>
            </telerik:RadTabStrip>
            <telerik:RadMultiPage runat="server" ID="RadGrid1DetailMultipage1" SelectedIndex="0" RenderSelectedPageOnly="false">
                <telerik:RadPageView runat="server" ID="RadGrid1DetailRadPageView1" CssClass="RadGridPageView">
                    <asp:FormView id="RadGrid1DetailForm1" CssClass="RadGridDetailForm" runat="server">
                        <ItemTemplate>
                            <div class="form-horizontal form-stripe" style="padding: 12px;">
                                <eva:FormUserDetail ID="FormUserDetail1" Item="<%# Container.DataItem %>" View="Detail1" runat="server" />
                                <div class="form-actions">
                                   <asp:LinkButton ID="FormConfirmUpdate" runat="server" CssClass="btn btn-primary" CommandName="EditFormView">
                                        <i class="icon icon-pencil"></i> Edit
                                    </asp:LinkButton>
                               </div>
                            </div>
                        </ItemTemplate>
     
                        <EditItemTemplate>
                            <div class="form-horizontal form-stripe" style="padding: 12px;">
                                <eva:FormUserEdit ID="FormUserDetail2" Item="<%# Container.DataItem %>" View="Detail1" runat="server" />
                                <div class="form-actions">
                                  <asp:Button runat="server" ID="FormConfirmUpdate" CssClass="btn btn-success" Text="Submit" CommandName="FormConfirmUpdate" />
                                   <asp:Button runat="server" ID="FormCancelUpdate" CssClass="btn" Text="Cancel" CommandName="FormCancelUpdate" />
                                </div>
                            </div>
                        </EditItemTemplate>
                    </asp:FormView>
                </telerik:RadPageView>
     
                <telerik:RadPageView runat="server" ID="RadGrid1DetailRadPageView2">
     
                </telerik:RadPageView>
                <telerik:RadPageView runat="server" ID="RadGrid1DetailRadPageView3">
     
                </telerik:RadPageView>
            </telerik:RadMultiPage>
        </asp:Panel>
    </NestedViewTemplate>

    The code behind for the EditFormView command is:

    Protected Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As GridCommandEventArgs) Handles RadGrid1.ItemCommand
        Dim gridFormView As FormView
        Dim primaryKey As Integer
      
        If TypeOf (e.Item) Is GridDataItem Then
            gridFormView = DirectCast(e.Item, GridDataItem).ChildItem.FindControl("RadGrid1DetailContainer").FindControl("RadGrid1DetailMultipage1").FindControl("RadGrid1DetailRadPageView1").FindControl("RadGrid1DetailForm1")
            primaryKey = Convert.ToInt32(DirectCast(e.Item, GridDataItem).GetDataKeyValue("UserId"))
        End If
      
        Select Case e.CommandName
            Case "EditFormView"
                e.Item.Expanded = True
      
                If TypeOf (e.Item) Is GridDataItem Then
                    DirectCast(e.Item, GridDataItem).ChildItem.FindControl("RadGrid1DetailContainer").Visible = True
      
                    ' Collapse all other opened details
                    For Each item As GridItem In e.Item.OwnerTableView.Items
                        If item.Expanded AndAlso Not item Is e.Item Then
                            item.Expanded = False
                            DirectCast(item.DataItem, GridDataItem).ChildItem.FindControl("RadGrid1DetailContainer").Visible = False
      
                            Dim gridFormViewToBeClosed As FormView = DirectCast(item.DataItem, GridDataItem).ChildItem.FindControl("RadGrid1DetailContainer").FindControl("RadGrid1DetailMultipage1").FindControl("RadGrid1DetailRadPageView1").FindControl("RadGrid1DetailForm1")
      
                            ' Put form always in ReadOnly when is expanded
                            If gridFormViewToBeClosed.CurrentMode <> FormViewMode.ReadOnly Then
                                gridFormViewToBeClosed.ChangeMode(FormViewMode.ReadOnly)
                            End If
                        End If
                    Next item
                End If
      
                ' Put form in EditMode when is expanded
                If gridFormView.CurrentMode <> FormViewMode.Edit Then
                    gridFormView.ChangeMode(FormViewMode.Edit)
                End If
      
                ' Fill the form view from the db
                SelectUserEdit(primaryKey, gridFormView)
        End Select
    End Sub

    The item.Expanded = False part works like expected. The issue I'm facing is how to retrieve a reference to the FormView(s) and to the RadGrid1DetailContainer  for each other row

    I tried with 
    DirectCast(item.DataItem, GridDataItem).ChildItem.FindControl("RadGrid1DetailContainer").Visible = False
    But I guess item.DataItem is not what I'm looking for since I always have a  System.NullReferenceException on that line... 

    Any hint on how to iterate and access the FormView in all the rows other than the one where the click command triggered, would be greatly appreciated. 

    Thanks in advance




  2. Marin
    Admin
    Marin avatar
    1045 posts

    Posted 13 Nov 2013 Link to this post

    Hello,

     A suitable event which will allow you to iterate over all the items in the grid is the ItemCreated event, which is fired once for each item in the control. There you can use similar logic to the one the ItemCommand event to access the inner RadGrid1DetailContainer and from there find the FormView. Here a sample code that you can use as a starting point:

    Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs) Handles RadGrid1.ItemCreated
            'will be executed for each item in the grid
             If TypeOf e.Item Is GridNestedViewItem Then
                Dim detailContainer = e.Item.FindControl("RadGrid1DetailContainer")
                detailContainer.Visible = False
                Dim gridFormView = detailContainer.FindControl("RadGrid1DetailMultipage1").FindControl("RadGrid1DetailRadPageView1").FindControl("RadGrid1DetailForm1")
            End If
        End Sub

    Additional information and code samples can find controls and iterating over the grid items can also be found in the following help topic:
    http://www.telerik.com/help/aspnet-ajax/grid-accessing-cells-and-rows.html
    http://www.telerik.com/help/aspnet-ajax/grid-nestedviewtemplate.html

    Regards,
    Marin
    Telerik
    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 the blog feed now.
  3. UI for ASP.NET Ajax is Ready for VS 2017
Back to Top