[CLOSED] RowExpander strange behavior

  1. #1

    [CLOSED] RowExpander strange behavior

    Hi Daniil.

    In regard this post
    http://forums.ext.net/showthread.php...n-nested-grids

    I have a problem with some strange behaviors with RowExpander when refreshing grid.

    I will post a sample code, the explain problems.

    Sorry I post separate codebehind and aspx code, but I had some problems trying to integrate them.

    Code behind:

    Imports Ext.Net
    Partial Class TestNestedData
        Inherits System.Web.UI.Page
    
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
    
            If Not Ext.Net.X.IsAjaxRequest Then
                Dim mStore As Store = Me.GridPanel1.GetStore
    
    
                Dim mSale As New Sale With {.PurchaseDate = Now}
    
    
                Dim mPackage As Package = New Package
                mPackage.Name = "Package1"
                mPackage.AddTraveller(New Traveller With {.Name = "John"})
                mPackage.AddTraveller(New Traveller With {.Name = "Mary"})
                mPackage.AddTraveller(New Traveller With {.Name = "Michael"})
    
    
                mSale.AddPackage(mPackage)
    
    
                mPackage = New Package
                mPackage.Name = "Package2"
                mPackage.AddTraveller(New Traveller With {.Name = "Alice"})
                mPackage.AddTraveller(New Traveller With {.Name = "Bob"})
    
    
                mSale.AddPackage(mPackage)
    
    
                Session.Add("Sale", mSale)
    
    
                mStore.DataSource = mSale.Packages
    
    
                mStore.DataBind()
            End If
    
    
        End Sub
    
    
        <DirectMethod()> _
        Public Sub GridRefresh()
            Dim mStore As Store = Me.GridPanel1.GetStore
            Dim mSale As Sale = Session("Sale")
    
    
            mStore.DataSource = mSale.Packages
            mStore.DataBind()
        End Sub
    
    
        <DirectMethod()> _
        Public Sub EditTraveller(ByVal pPackageIndex As Integer, ByVal pTravellerIndex As Integer)
    
    
            Dim mSale As Sale = Session("Sale")
    
    
            txtName.Text = mSale.Packages(pPackageIndex).Travellers(pTravellerIndex).Name
    
    
            hddPackageId.Value = pPackageIndex
            hddTravellerId.Value = pTravellerIndex
    
    
            GridPanel1.Disabled = True
            pnlEditTraveller.Disabled = False
    
    
        End Sub
    
    
        <DirectMethod()> _
        Public Sub SaveTraveller(ByVal pPackageIndex As Integer, ByVal pTravellerIndex As Integer)
    
    
            Dim mSale As Sale = Session("Sale")
    
    
            Dim mPreviousName As String = mSale.Packages(pPackageIndex).Travellers(pTravellerIndex).Name
    
    
            AliceNameLabel.Text = "Changing name " & mPreviousName & " by " & txtName.Text
    
    
            mSale.Packages(pPackageIndex).Travellers(pTravellerIndex).Name = txtName.Text
    
    
            txtName.Text = ""
            pnlEditTraveller.Disabled = True
            GridPanel1.Disabled = False
    
    
            GridRefresh()
    
    
        End Sub
    
    
        <DirectMethod()> _
        Public Sub CancelEditTraveller()
    
    
            txtName.Text = ""
            GridPanel1.Disabled = False
            pnlEditTraveller.Disabled = True
    
    
        End Sub
    
    
        <DirectMethod()> _
        Public Sub GetAliceName()
            Dim mSale As Sale = Session("Sale")
            If IsNothing(mSale) Then
                AliceNameLabel.Text = "Sale not found"
                Exit Sub
            End If
    
    
            Dim mPackage As Package = mSale.Packages(1)
    
    
            If IsNothing(mPackage) Then
                AliceNameLabel.Text = "Package not found"
                Exit Sub
            End If
    
    
            Dim mTraveller As Traveller = mPackage.Travellers(0)
    
    
            If IsNothing(mTraveller) Then
                AliceNameLabel.Text = "Traveller not found"
                Exit Sub
            End If
    
    
            AliceNameLabel.Text = "Alice's name: " & mTraveller.Name
        End Sub
    End Class
    
    
    Public Class Sale
    
    
        Private mPackages As New List(Of Package)
    
    
    
    
        Private mDate As Date
        Public Property PurchaseDate() As Date
            Get
                Return mDate
            End Get
            Set(ByVal value As Date)
                mDate = value
            End Set
        End Property
    
    
        Public ReadOnly Property Packages() As List(Of Package)
            Get
                Return mPackages
            End Get
        End Property
    
    
        Public Sub AddPackage(ByVal pPackage As Package)
    
    
            pPackage.Index = mPackages.Count
            mPackages.Add(pPackage)
    
    
        End Sub
    
    
    End Class
    
    
    
    
    Public Class Package
    
    
        Private mTravellers As New List(Of Traveller)
    
    
        Private mIndex As Integer
        Public Property Index() As Integer
            Get
                Return mIndex
            End Get
            Set(ByVal value As Integer)
                mIndex = value
            End Set
        End Property
    
    
    
    
        Private mName As String
        Public Property Name() As String
            Get
                Return mName
            End Get
            Set(ByVal value As String)
                mName = value
            End Set
        End Property
    
    
        Public ReadOnly Property Travellers() As List(Of Traveller)
            Get
                Return mTravellers
            End Get
        End Property
    
    
        Public Sub AddTraveller(ByVal pTraveller As Traveller)
    
    
            pTraveller.Index = mTravellers.Count
            mTravellers.Add(pTraveller)
    
    
        End Sub
    
    
    End Class
    
    
    Public Class Traveller
    
    
    
    
        Private mIndex As Integer
        Public Property Index() As Integer
            Get
                Return mIndex
            End Get
            Set(ByVal value As Integer)
                mIndex = value
            End Set
        End Property
    
    
    
    
        Private mName As String
        Public Property Name() As String
            Get
                Return mName
            End Get
            Set(ByVal value As String)
                mName = value
            End Set
        End Property
    
    
    
    
    
    
    End Class
    aspx code:

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="TestNestedData.aspx.vb"
        Inherits="TestNestedData" %>
    
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Ext.NET Example</title>
    
    
        <script type="text/javascript"> 
            function EditTraveller(pPackageId, pTravellerId)
            {
                //alert('Traveller\'s Index is: ' + pTravellerId + ' , Package\'s Index is: ' + pPackageId)
                Ext.net.DirectMethods.EditTraveller(pPackageId,pTravellerId);
            }
            
            function RefreshClientside()
            {
                GridPanel1.store.reload();
            }
            
            function RefreshServerside()
            {
                Ext.net.DirectMethods.GridRefresh()    
            }
        </script>
    
    
    </head>
    <body>
    <form id="form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <ext:FormPanel ID="frmPanel1" runat="server">
            <Items>
                <ext:GridPanel ID="GridPanel1" runat="server" AutoHeight="true" Width="300">
                    <Store>
                        <ext:Store ID="Store1" runat="server" OnRefreshData="GridRefresh">
                            <Reader>
                                <ext:JsonReader IDProperty="Index">
                                    <Fields>
                                        <ext:RecordField Name="Name" />
                                        <ext:RecordField Name="Travellers" IsComplex="true" />
                                        <ext:RecordField Name="Index" />
                                    </Fields>
                                </ext:JsonReader>
                            </Reader>
                            <Listeners>
                                <DataChanged Handler="if(Ext.getCmp('GridPanel1') != undefined){Ext.getCmp('GridPanel1').getRowExpander().collapseAll();Ext.getCmp('GridPanel1').getRowExpander().expandAll();};" />
                            </Listeners>
                        </ext:Store>
                    </Store>
                    <ColumnModel ID="ColumnModel1" runat="server">
                        <Columns>
                            <ext:Column Header="Package name" DataIndex="Name" Width="200" />
                        </Columns>
                    </ColumnModel>
                    <Plugins>
                        <ext:RowExpander ID="RowExpander1" runat="server">
                            <Template ID="Template1" runat="server">
                                <Html>
                                <tpl for="Travellers">
                            <tpl if="[xindex]==1">
                                <table width="100%" border="0" cellspacing="0" cellpadding="0">
                                <tr>
                                    <td colspan="3" style="font-weight:bold;">Travellers</td>
                                </tr>
                               
                            </tpl>
                            <tr>
                            <td>{Name}</td>
                            <td><a href="Javascript:EditTraveller({[parent.Index]},{Index});">Edit traveller</a></td></tr> 
                            <tpl if="[xcount-xindex]==0">
                                <tr><td colspan="3" style="height:8px;">&nbsp;</td></tr>
                                </table>
                            </tpl>
                       </tpl>
                                </Html>
                            </Template>
                        </ext:RowExpander>
                    </Plugins>
                    <Listeners>
                        <ViewReady Handler="this.getRowExpander().expandAll();" />
                        <%--<ViewReady Handler="this.getRowExpander().collapseAll();this.getRowExpander().expandAll();" />--%>
                    </Listeners>
                </ext:GridPanel>
                <ext:Panel runat="server" Title="Traveller" Disabled="true" Width="300" ID="pnlEditTraveller">
                    <Items>
                        <ext:TextField runat="server" ID="txtName" FieldLabel="Name" IsFormField="true">
                        </ext:TextField>
                        <ext:Hidden ID="hddPackageId" runat="server">
                        </ext:Hidden>
                        <ext:Hidden ID="hddTravellerId" runat="server">
                        </ext:Hidden>
                    </Items>
                    <BottomBar>
                        <ext:Toolbar runat="server">
                            <Items>
                                <ext:Button runat="server" ID="btnSave" Text="Save">
                                    <Listeners>
                                        <Click Handler="Ext.net.DirectMethods.SaveTraveller(hddPackageId.value, hddTravellerId.value);" />
                                    </Listeners>
                                </ext:Button>
                                <ext:Button runat="server" ID="btnCancel" Text="Cancel">
                                    <Listeners>
                                        <Click Handler="Ext.net.DirectMethods.CancelEditTraveller();" />
                                    </Listeners>
                                </ext:Button>
                               
                            </Items>
                        </ext:Toolbar>
                    </BottomBar>
                </ext:Panel>
                <ext:Label runat="server" ID="AliceNameLabel"></ext:Label>
            </Items>
        </ext:FormPanel>
        <a href="Javascript:RefreshClientside();void(0);">Refresh client-side</a><br />
        <a href="Javascript:RefreshServerside();void(0);">Refresh server-side</a><br /><br />
        
        <a href="Javascript:Ext.net.DirectMethods.GetAliceName();void(0);">Check Alice's name from session</a>
        
        </form>
    </body>
    </html>
    The first problem comes when I refresh data twice. The first time the grid refresh there is no problem. The second time, rowexpanders doesn't show, athough expanding icons show es if they where expanded (with minus sign). I have to manually "collapse" the missing rowexpander, and re expand them one by one to get them back. After that, if I refresh again the grid, everything runs ok, but second time, again the bug appears.

    I solved this with a non straightforward hack. I added a listener to the store that collapses and expands all controls everytime Data changes. (comment that line to reproduce the bug).

    For the second problem, I can't find a solution.
    I change some data for the first time (a traveller's name) and save. Information on server is ok, but rowexpander doesn't refresh (althought I call refresh method). The second time I refresh, rowexpander show fresh data, and all following times also. The problem appears just the first time.

    This does not happen with regular row data, that refresh ok every time I refresh grid (including the first one).

    Thanks
    Regards
    Fernando
    Last edited by Daniil; Apr 24, 2012 at 7:43 PM. Reason: [CLOSED]
  2. #2
    Hi,

    Quote Originally Posted by FAS View Post
    The first problem comes when I refresh data twice. The first time the grid refresh there is no problem. The second time, rowexpanders doesn't show, athough expanding icons show es if they where expanded (with minus sign). I have to manually "collapse" the missing rowexpander, and re expand them one by one to get them back. After that, if I refresh again the grid, everything runs ok, but second time, again the bug appears.

    I solved this with a non straightforward hack. I added a listener to the store that collapses and expands all controls everytime Data changes. (comment that line to reproduce the bug).
    Yes, it's the same that I suggested here:
    http://forums.ext.net/showthread.php...ll=1#post79635

    It should work. Though we will try to find the root of the problem.
  3. #3
    Quote Originally Posted by FAS View Post
    For the second problem, I can't find a solution.
    I change some data for the first time (a traveller's name) and save. Information on server is ok, but rowexpander doesn't refresh (althought I call refresh method). The second time I refresh, rowexpander show fresh data, and all following times also. The problem appears just the first time.
    I was unable to reproduce that issue. I edit names and see they are updated after clicking on the Save button.

    Please provide the exact steps you are following to reproduce the issue.
  4. #4
    Hi Daniil.

    I am taking the same steps mentioned with this same code.

    Just in case... I am using Ext.net 1.2.0.21945

    Here are the screens I get using this ad-hoc example posted here (same behavior in IE 7,8, Chrome and FF)

    Initial screen:
    Click image for larger version. 

Name:	Inicio.jpg 
Views:	104 
Size:	45.0 KB 
ID:	4159

    Editing Alice's name:
    Click image for larger version. 

Name:	AliceNameChange.jpg 
Views:	98 
Size:	34.5 KB 
ID:	4160

    Alice's name changed. Grid first refreshed but still showing old name (bug)
    Click image for larger version. 

Name:	AliceNameChanged.jpg 
Views:	85 
Size:	46.0 KB 
ID:	4161

    Checking Alice's changed name from server (data in server was successfully changed)
    Click image for larger version. 

Name:	CheckAliceChangedNameFromServer.jpg 
Views:	81 
Size:	44.6 KB 
ID:	4162

    Grid refreshed second time manually. Now it shows Alice's new name (Emma). All next grid refreshes (manually or with Saved data) will show fresh information from server and the bug doesn't happen anymore.
    Click image for larger version. 

Name:	RefreshGridSecondTime.jpg 
Views:	86 
Size:	42.0 KB 
ID:	4163
  5. #5
    Any other data edition refreshes Grid without problem (Bob's name changed here)
    Click image for larger version. 

Name:	BobNameChanged.jpg 
Views:	85 
Size:	44.1 KB 
ID:	4164

    Thanks
    Regards
    Fernando
  6. #6
    After some amount of attempts I reproduced several times (about 3) the behavior you described. But it's not systematicallyю

    I think adding
    Delay="10"
    for the Store DataChanged listener should help to resolve the problem.

    Please try.
  7. #7
    It seems it did!

    Until now I didn't get that bug again.

    You may close this.

    Thanks.
    Regards
    Fernando

Similar Threads

  1. Replies: 9
    Last Post: May 21, 2012, 4:05 PM
  2. [CLOSED] Strange behavior of default parameters
    By 78fede78 in forum 1.x Legacy Premium Help
    Replies: 2
    Last Post: Nov 05, 2010, 5:39 PM
  3. [CLOSED] [1.0] Strange behavior - LockingGridView & RowEditor
    By alliedwallet.com in forum 1.x Legacy Premium Help
    Replies: 2
    Last Post: Oct 26, 2010, 8:50 PM
  4. [CLOSED] Strange behavior of fieldset
    By 78fede78 in forum 1.x Legacy Premium Help
    Replies: 1
    Last Post: Oct 20, 2010, 11:55 AM
  5. [CLOSED] AutoLoad IFrame strange behavior
    By acrossdev in forum 1.x Legacy Premium Help
    Replies: 15
    Last Post: May 20, 2009, 10:20 AM

Posting Permissions