[CLOSED] RowExpander: Cannot set property 'component' of null

Page 1 of 2 12 LastLast
  1. #1

    [CLOSED] RowExpander: Cannot set property 'component' of null

    Hello.

    I have a Grid that contains a RowExpander.

    The RowExpander opens a Grid and a TextField, which are built in code-behind.

    When the Grid is expanded, a JavaScript exception is thrown: Cannot set property 'component' of null.

    Please find below a code sample

    <!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">
        <script runat="server">
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack && !IsAsync)
                {
                    List<object> userList = new List<object>();
    
                    userList.Add(new { id = "1", fullname = "john doe" });
                    userList.Add(new { id = "2", fullname = "marilyn monroe" });
                    userList.Add(new { id = "3", fullname = "jack smith" });
                    userList.Add(new { id = "4", fullname = "andy murray" });
    
                    storeName.DataSource = userList;
                    storeName.DataBind();
                }
            }
    
            [DirectMethod]
            public static string GetForm(Dictionary<string, string> parameters)
            {
                int id = Convert.ToInt32(parameters["ID"]);
                string name = Convert.ToString(parameters["FULLNAME"]);
                Ext.Net.FormPanel formRowExpander = new Ext.Net.FormPanel();
    
                formRowExpander = createRowExpander(id, name);
    
                return ComponentLoader.ToConfig(formRowExpander, true);
            }
    
            public static Ext.Net.FormPanel createRowExpander(int id, string name)
            {
                Ext.Net.FormPanel formPanelExpanded = new FormPanel()
                {
                    ID = "formPanelExpanded",
                    Height = 200,
                    Width = 290
                };
    
                Ext.Net.GridPanel grid = new Ext.Net.GridPanel()
                {
                    ID = "grid",
                    Height = 150,
                    Width = 557
                };
    
                //BUILDING THE STORE
                Ext.Net.Store storeIDs = new Ext.Net.Store()
                {
                    ID = "storeIDs"
                };
    
                //BUILDING THE MODEL
                Ext.Net.Model model = new Ext.Net.Model();
    
                //BUILDING THE MODELFIELDS
                Ext.Net.ModelField idfield = new Ext.Net.ModelField()
                {
                    Name = "id",
                    Type = Ext.Net.ModelFieldType.Int
                };
                Ext.Net.ModelField title = new Ext.Net.ModelField()
                {
                    Name = "title",
                    Type = Ext.Net.ModelFieldType.String
                };
                Ext.Net.ModelField isChecked = new Ext.Net.ModelField()
                {
                    Name = "isChecked",
                    Type = Ext.Net.ModelFieldType.Boolean
                };
    
                //ADDING THE FIELDS TO THE MODEL
                model.Fields.Add(idfield);
                model.Fields.Add(title);
                model.Fields.Add(isChecked);
    
                //ADDING THE MODEL TO THE STORE
                storeIDs.Model.Add(model);
    
                //BUILDING THE OBJECTS
                List<object> objectList = new List<object>();
    
                objectList.Add(new { id = 1, title = "mr", isChecked = true });
                objectList.Add(new { id = 1, title = "ms", isChecked = false });
                objectList.Add(new { id = 1, title = "mrs", isChecked = false });
    
                storeIDs.DataSource = objectList;
                storeIDs.DataBind();
    
                //ADDING THE STORE TO THE GRID
                grid.Store.Add(storeIDs);
    
                //BUILDING THE COLUMNS
                Ext.Net.Column columnId = new Ext.Net.Column()
                {
                    ID = "clnId",
                    DataIndex = "id",
                    Hidden = true,
                    Hideable = false
                };
                Ext.Net.Column columnTitle = new Ext.Net.Column()
                {
                    ID = "clnTitleExpander",
                    DataIndex = "title",
                    Text = "Title",
                    Flex = 1
                };
                Ext.Net.CheckColumn columnIsChecked = new Ext.Net.CheckColumn()
                {
                    ID = "clnIsChecked",
                    Text = "Assign",
                    DataIndex = "isChecked",
                    Editable = true,
                    Width = 100
                };
    
                //ADDING THE COLUMNS TO THE GRID'S COLUMN MODEL
                grid.ColumnModel.Columns.Add(columnId);
                grid.ColumnModel.Columns.Add(columnTitle);
                grid.ColumnModel.Columns.Add(columnIsChecked);
    
                //TEXTFIELD IS NEEDED
                Ext.Net.TextField hiddenText = new Ext.Net.TextField()
                {
                    ID = "hdnText",
                    LabelSeparator = " ",
                    Hidden = true,
                    Text = id + "|" + name
                };
    
                //ADDING THE GRID AND TEXTFIELD TO THE FORMPANEL
                formPanelExpanded.Items.Add(grid);
                formPanelExpanded.Items.Add(hiddenText);
    
                return formPanelExpanded;
            }
        </script>
        <title></title>
    </head>
    <body>
        <ext:ResourceManager runat="server" ID="resourceManager">
        </ext:ResourceManager>
        <form runat="server">
            <ext:FormPanel Height="570" StyleSpec="text-align:left;" ID="frmPanelGlobal" runat="server"
                Layout="ColumnLayout">
                <Items>
                    <ext:FormPanel runat="server" ID="formPanel" Width="600" Height="400">
                        <Items>
                            <ext:GridPanel runat="server" ID="gridPanelUser" Width="600" Height="400">
                                <Store>
                                    <ext:Store runat="server" ID="storeName">
                                        <Model>
                                            <ext:Model ID="Model1" runat="server">
                                                <Fields>
                                                    <ext:ModelField Name="id" Type="Int" />
                                                    <ext:ModelField Name="fullname" Type="String" />
                                                </Fields>
                                            </ext:Model>
                                        </Model>
                                    </ext:Store>
                                </Store>
                                <ColumnModel ID="ColumnModel1" runat="server">
                                    <Columns>
                                        <ext:Column ID="clnId" runat="server" DataIndex="id" Text="Name" Hidden="true"
                                            Hideable="false" />
                                        <ext:Column ID="clnFullName" runat="server" DataIndex="fullname" Flex="1" Text="Full Name" />
                                    </Columns>
                                </ColumnModel>
                                <Plugins>
                                    <ext:RowExpander runat="server" ID="rowExpander">
                                        <Loader ID="Loader1" runat="server" DirectMethod="#{DirectMethods}.GetForm" Mode="Component">
                                            <LoadMask Msg="Loading" ShowMask="true" />
                                            <Params>
                                                <ext:Parameter Name="ID" Value="this.record.data.id" Mode="Raw" />
                                                <ext:Parameter Name="FULLNAME" Value="this.record.data.fullname" Mode="Raw" />
                                            </Params>
                                        </Loader>
                                    </ext:RowExpander>
                                </Plugins>
                            </ext:GridPanel>
                        </Items>
                    </ext:FormPanel>
                </Items>
            </ext:FormPanel>
        </form>
    </body>
    </html>

    Any advice is appreciated.
    Last edited by fabricio.murta; Feb 02, 2015 at 12:50 PM. Reason: [CLOSED]
  2. #2
    You have duplicated clnId columns.
  3. #3
    Each record must have unique ID, so replace

    objectList.Add(new { id = 1, title = "mr", isChecked = true });
    objectList.Add(new { id = 1, title = "ms", isChecked = false });
    objectList.Add(new { id = 1, title = "mrs", isChecked = false });
    by
    objectList.Add(new { id = 1, title = "mr", isChecked = true });
    objectList.Add(new { id = 2, title = "ms", isChecked = false });
    objectList.Add(new { id = 3, title = "mrs", isChecked = false });
  4. #4
    Thank you @RCN, that was exactly the problem, the column ID was duplicated.

    Strangely, it was working before we migrated to EXT 3.0.

    As for the data, that's true it was just dummy data.
  5. #5
    You are creating two instances of FormPanel, first one is not needed.

    So, replace
    Ext.Net.FormPanel formRowExpander = new Ext.Net.FormPanel();
    
    formRowExpander = createRowExpander(id, name);
    by
    Ext.Net.FormPanel formRowExpander = createRowExpander(id, name);
    Last edited by RCN; Feb 02, 2015 at 10:54 AM.
  6. #6
    Thank you Raphael.


    This thread can be closed.
  7. #7
    Refactored Code
    <!DOCTYPE html>
    <html>
    <head id="Head1" runat="server">
        <script runat="server">
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack && !IsAsync)
                {
                    List<object> userList = new List<object>();
    
                    userList.Add(new { id = "1", fullname = "john doe" });
                    userList.Add(new { id = "2", fullname = "marilyn monroe" });
                    userList.Add(new { id = "3", fullname = "jack smith" });
                    userList.Add(new { id = "4", fullname = "andy murray" });
    
                    storeName.DataSource = userList;
    
                    storeName.DataBind();
                }
            }
    
            [DirectMethod]
            public string GetForm(Dictionary<string, string> parameters)
            {
                int id = Convert.ToInt32(parameters["ID"]);
    
                string name = Convert.ToString(parameters["FULLNAME"]);
    
                Ext.Net.FormPanel formRowExpander = createRowExpander(id, name);
    
                return ComponentLoader.ToConfig(formRowExpander, true);
            }
    
            public Ext.Net.FormPanel createRowExpander(int id, string name)
            {
                Ext.Net.FormPanel formPanelExpanded = new FormPanel
                {
                    Height = 200,
                    Width = 290
                };
    
                BuildGrid(formPanelExpanded);
    
                BuildHidden(formPanelExpanded, id, name);
    
                return formPanelExpanded;
            }
    
            private void BuildGrid(FormPanel frm)
            {
                Ext.Net.GridPanel grid = new Ext.Net.GridPanel
                {
                    Height = 150,
                    Width = 557
                };
    
                //BUILDING THE STORE
                Ext.Net.Store storeIDs = new Ext.Net.Store();
    
                //BUILDING THE MODEL
                Ext.Net.Model model = new Ext.Net.Model();
    
                //BUILDING THE MODELFIELDS
                Ext.Net.ModelField idfield = new Ext.Net.ModelField()
                {
                    Name = "id",
                    Type = Ext.Net.ModelFieldType.Int
                };
                Ext.Net.ModelField title = new Ext.Net.ModelField()
                {
                    Name = "title",
                    Type = Ext.Net.ModelFieldType.String
                };
                Ext.Net.ModelField isChecked = new Ext.Net.ModelField()
                {
                    Name = "isChecked",
                    Type = Ext.Net.ModelFieldType.Boolean
                };
    
                //ADDING THE FIELDS TO THE MODEL
                model.Fields.Add(idfield);
                model.Fields.Add(title);
                model.Fields.Add(isChecked);
    
                //ADDING THE MODEL TO THE STORE
                storeIDs.Model.Add(model);
    
                //BUILDING THE OBJECTS
                List<object> objectList = new List<object>();
    
                objectList.Add(new { id = 1, title = "mr", isChecked = true });
                objectList.Add(new { id = 2, title = "ms", isChecked = false });
                objectList.Add(new { id = 3, title = "mrs", isChecked = false });
    
                storeIDs.DataSource = objectList;
                storeIDs.DataBind();
    
                //ADDING THE STORE TO THE GRID
                grid.Store.Add(storeIDs);
    
                //BUILDING THE COLUMNS
                Ext.Net.Column columnId = new Ext.Net.Column()
                {
                    DataIndex = "id",
                    Hidden = true,
                    Hideable = false
                };
                Ext.Net.Column columnTitle = new Ext.Net.Column()
                {
                    DataIndex = "title",
                    Text = "Title",
                    Flex = 1
                };
                Ext.Net.CheckColumn columnIsChecked = new Ext.Net.CheckColumn()
                {
                    Text = "Assign",
                    DataIndex = "isChecked",
                    Editable = true,
                    Width = 100
                };
    
                //ADDING THE COLUMNS TO THE GRID'S COLUMN MODEL
                grid.ColumnModel.Columns.Add(columnId);
                grid.ColumnModel.Columns.Add(columnTitle);
                grid.ColumnModel.Columns.Add(columnIsChecked);
    
                frm.Items.Add(grid);
            }
    
            private void BuildHidden(FormPanel frm, int id, string name)
            {
                //TEXTFIELD IS NEEDED
                Ext.Net.TextField hiddenText = new Ext.Net.TextField()
                {
                    LabelSeparator = " ",
                    Hidden = true,
                    Text = string.Format("{0}|{1}", id, name)
                };
    
                frm.Items.Add(hiddenText);
            }
        </script>
        <title></title>
    </head>
    <body>
        <ext:ResourceManager runat="server" ID="resourceManager">
        </ext:ResourceManager>
        <form runat="server">
            <ext:FormPanel Height="570" StyleSpec="text-align:left;" ID="frmPanelGlobal" runat="server"
                Layout="ColumnLayout">
                <Items>
                    <ext:FormPanel runat="server" ID="formPanel" Width="600" Height="400">
                        <Items>
                            <ext:GridPanel runat="server" ID="gridPanelUser" Width="600" Height="400">
                                <Store>
                                    <ext:Store runat="server" ID="storeName">
                                        <Model>
                                            <ext:Model ID="Model1" runat="server">
                                                <Fields>
                                                    <ext:ModelField Name="id" Type="Int" />
                                                    <ext:ModelField Name="fullname" Type="String" />
                                                </Fields>
                                            </ext:Model>
                                        </Model>
                                    </ext:Store>
                                </Store>
                                <ColumnModel ID="ColumnModel1" runat="server">
                                    <Columns>
                                        <ext:Column ID="clnId" runat="server" DataIndex="id" Text="Name" Hidden="true"
                                            Hideable="false" />
                                        <ext:Column ID="clnFullName" runat="server" DataIndex="fullname" Flex="1" Text="Full Name" />
                                    </Columns>
                                </ColumnModel>
                                <Plugins>
                                    <ext:RowExpander runat="server" ID="rowExpander">
                                        <Loader ID="Loader1" runat="server" DirectMethod="#{DirectMethods}.GetForm" Mode="Component">
                                            <LoadMask Msg="Loading" ShowMask="true" />
                                            <Params>
                                                <ext:Parameter Name="ID" Value="this.record.data.id" Mode="Raw" />
                                                <ext:Parameter Name="FULLNAME" Value="this.record.data.fullname" Mode="Raw" />
                                            </Params>
                                        </Loader>
                                    </ext:RowExpander>
                                </Plugins>
                            </ext:GridPanel>
                        </Items>
                    </ext:FormPanel>
                </Items>
            </ext:FormPanel>
        </form>
    </body>
    </html>
    You need to be careful when assigning IDs of dynamic items, because it may lead to conflicts.
  8. #8
    Strangely, it was working before we migrated to EXT 3.0.
    On previous version, have you set ResourceManager's IDMode?

    Going further, your code works if you set ResourceManager's IDMode to Predictable, as shown below:
    <ext:ResourceManager IDMode="Predictable" runat="server" />
    Last edited by RCN; Feb 02, 2015 at 11:13 AM.
  9. #9
    In previous versions, the resource was always declared with an ID and runat="server"

    Example:

    <ext:ResourceManager runat="server" ID="resourceManager">
        </ext:ResourceManager>
    IDMode was not set.
  10. #10
    Do you need further assistance? Can this thread be marked as closed?
Page 1 of 2 12 LastLast

Similar Threads

  1. Replies: 1
    Last Post: Sep 30, 2013, 10:46 AM
  2. Replies: 8
    Last Post: Feb 06, 2013, 6:27 PM
  3. Replies: 4
    Last Post: Oct 16, 2012, 12:04 AM
  4. [CLOSED] [1.0] RowExpander Component
    By state in forum 1.x Legacy Premium Help
    Replies: 1
    Last Post: Apr 07, 2010, 9:01 AM
  5. [CLOSED] RowExpander Component with ChecboxSelectionModel
    By amitpareek in forum 1.x Legacy Premium Help
    Replies: 20
    Last Post: Mar 25, 2010, 1:38 PM

Posting Permissions