Apr 20, 2012, 6:11 PM
[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:
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
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;"> </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]