Click here to Skip to main content
15,885,129 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
Actually i'm creating web template using asp.net and c#.
in my user control page i have to create the table dynamically. i just read the data from XML file then retrieve the name and number of columns and rows of each table. while i'm creating the table i assign the name and id to each cell. because i have one row including some textbox for adding the data to database. but after i have created the table i can not access to the textbox cells based on id to get their data and insert it to database. my dynamic table code is:

C#
public void CreateAddDynamicTable()
{
    XmlDocument xDocRead = new XmlDocument();
    xDocRead.Load(Server.MapPath("ModuleTemp.xml"));
    string xModuleName = hid_ChooseModule.Value;
    XmlNode xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
    int colCount = xColCounter.ChildNodes.Count;

    int nonPkCounter = 0;
    string[] nonPrimaryKey = new string[100];
    string[] nonPkNewDataTemp = new string[100];

    for (int i = 1; i <= colCount; i++)
    {
        if (xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("IsPrimaryKey").Value == "N")
        {
            nonPrimaryKey[nonPkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
            nonPkCounter++;
        }
    }

    ph_Uc_AddModule.Controls.Clear();

    // Fetch the number of Rows and Columns for the table 
    // using the properties
    int tblRows = nonPkCounter;
    int tblCols = 2;

    // Create a Table and set its properties 
    Table tbl = new Table();
    // Add the table to the placeholder control
    ph_Uc_AddModule.Controls.Add(tbl);
    // Now iterate through the table and add your controls 
    for (int i = 0; i < tblRows; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < tblCols; j++)
        {
            TableCell tc = new TableCell();
            Label td_Add_Header = new Label();
            TextBox td_Add = new TextBox();

            if (j == 0)
            {
                td_Add_Header.Text = nonPrimaryKey[i];
                td_Add_Header.ID = "lb" + (i + 1) + "_header_AddModule";

                // Add the control to the TableCell
                tc.Controls.Add(td_Add_Header);
                tc.CssClass = "td_Header_AddModule";
            }
            else
            {
                td_Add.Text = "";
                td_Add.ID = "tb" + (i + 1) + "_AddModule";
                // Add the control to the TableCell
                tc.Controls.Add(td_Add);
                tc.CssClass = "td_Tb_AddModule";
            }

            // Add the TableCell to the TableRow
            tr.Cells.Add(tc);
        }
        // Add the TableRow to the Table
        tbl.Rows.Add(tr);
    }
}

my user control page which is contain a PlaceHolder is as below:


XML
<asp:Panel ID="pn_Uc_TModule" runat="server">

<asp:Table runat="server" ID="table_Uc_TModule" CssClass="table_Uc_TModule" Width="100%">
 <asp:TableRow runat="server" VerticalAlign="Top" Height="50px">
                <asp:TableCell runat="server">
                    <asp:Button runat="server" Text="" CssClass="btn_Add_Active" OnClick="btn_AddNew_Click" />
                    <asp:Button ID="btn_Cancel_NewItem" runat="server" Text="" CssClass="btn_Cancel_New" OnClick="btn_Cancel_AddNew" Visible="false" />

                    <asp:Table runat="server" ID="table_Uc_AddModule" Visible="false">
                        <asp:TableRow runat="server">
                            <asp:TableCell runat="server" >

                                <asp:PlaceHolder ID="ph_Uc_AddModule" runat="server">
                                </asp:PlaceHolder>

                            </asp:TableCell>
                        </asp:TableRow>
                        <asp:TableRow ID="TableRow1" runat="server">
                            <asp:TableCell runat="server" CssClass="td_Tb_AddModule" HorizontalAlign="Center">
                                <asp:Button ID="btn_Insert" runat="server" OnClick="Uc_AddModule_ItemInsert" Text="" CssClass="btn_Add" />
                                <asp:Button ID="btn_Cancel" runat="server" OnClick="Uc_AddModule_Clear" Text="" CssClass="btn_Clear" />
                            </asp:TableCell>
                        </asp:TableRow>
                    </asp:Table>

                </asp:TableCell>
            </asp:TableRow>
</asp:Table>
</asp:Panel>


i'm using below method in my insert function at the code behind to access the data inserted at the textbox:

C#
for (int i = 1; i <= nonPkCounter; i++)
    {
        TextBox textBox = (ph_Uc_AddModule.FindControl("tb" + i + "_AddModule")) as TextBox;
        nonPkNewDataTemp[i] = textBox.Text;
    }


i have tried pn_Uc_TModule.FindControl("tb" + i + "_AddModule") and also This.ph_Uc_AddModule.FindControl("tb" + i + "_AddModule") but still con not get the texbox data to insert it to database. could you please guide me how to get it done. appreciate your consideration.
Posted

Hi Far
you can try this,

aspx.cs page write this code,

XML
foreach (Control c in form1.Controls)
       {
           if (c.GetType ( ).Name.ToLower ( ) == "webusercontrol_ascx")
           {
               UserControl uc = (UserControl)c;

              TextBox txt = (TextBox)uc.FindControl ( "controlidname" );
               Response.Write ( "Controlvalue:                " + txt.Text + "</br>" );
}
}
 
Share this answer
 
v2
Comments
Far sh 24-Feb-12 2:24am    
Hi Bojjiaiah,
thanks for your answer.
actually my user control page is inside an updatepanel in my aspx page as below:

<asp:UpdatePanel ID="upn_ModuleContent" runat="server" UpdateMode="Conditional">
<contenttemplate>

<asp:uc_Module_Temp ID="uc_Module_Temp1" runat="server" Visible="false" />


<Triggers>
<asp:AsyncPostBackTrigger ControlID="btn_Home" EventName="Click" />
</Triggers>



based on what you mentioned i have tried:

foreach (Control c in MTMainForm.Controls)
{
if (c.GetType().Name.ToLower() == "uc_Module_Temp_ascx")
{
UserControl uc = (UserControl)c;

TextBox txt = (TextBox)uc.FindControl("tb2_AddModule");
Response.Write("Controlvalue: " + txt.Text + "</br>");
}
}

and also:

foreach (Control c in MTMainForm.Controls)
{
if (c.GetType().Name.ToLower() == "uc_Module_Temp1")
{
UserControl uc = (UserControl)c;

TextBox txt = (TextBox)uc.FindControl("tb2_AddModule");
Response.Write("Controlvalue: " + txt.Text + "</br>");
}
}

but still can not access to the textbox of my usercontrol page...
any other option or did i missed something?
thanks
why don't u expose a read-only property (TextBoxValue) with the value of the TextBox and once you find the UserControl, just select the UserControl.TextBoxValue :

UserControl

C#
public int TextBoxValue
{
   get { return this.txtBox.Text; }
}


ASPX
C#
foreach (Control c in form1.Controls)
 {
     if (c.GetType ( ).Name.ToLower ( ) == "webusercontrol_ascx")
     {
        UserControl uc = (UserControl)c;
        if(uc != null)
        {
           Response.Write ( "Controlvalue: " + uc.TextBoxValue + "" );
        }
     }
}

[edit] code blocks added [/edit]
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900