Search code examples
c#asp.netgridviewdatatabletextbox

How to read dynamically added texbox's value in gridview


I need to create dynamic form, which i will have to create the textbox, textarea,dropdown etc, based on the field type.

Now, I have successfully created this dynamic textbox etc using my rowdatabound.

My problem is I could not retrieve the textbox value entered when the save button is clicked.

My aspx file

                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox runat="server" ID="selectProspect" Checked="true" />
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:BoundField DataField="FieldTitle" HeaderText="" />
                <asp:BoundField DataField="FieldType" HeaderText="FieldType" />
                <asp:TemplateField>
                    <ItemTemplate>
                     //DYNAMICALLY ADDING TEXTBOX

                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="RightText" HeaderText="" />
                <asp:BoundField DataField="TemplatesInfoCode" HeaderText="TemplatesInfoCode" ItemStyle-CssClass="hiddencol" />
            </Columns>
        </asp:GridView>

My code behind file

protected void Page_Load(object sender, EventArgs e)
{
    GetTemplateComponent();

}


public void GetTemplateComponent()
{
    StringBuilder sb;
    DataSet ds;


    sb = new StringBuilder();
    sb.AppendLine("select * from template where tc='0002' order by Sequence");
    ds = Conn.DataAdapter(CommandType.Text, sb.ToString());

    gv.DataSource = ds;
    gv.DataBind();
}

protected void gv_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string value = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "FieldType"));

        if (value == "Date" || value == "TextBox")
        {


            TextBox TextBox1 = new TextBox() { ID = "TextBox1", EnableViewState = false, CssClass = "form-control" };
            e.Row.Cells[3].Controls.Add(TextBox1);
        }
        if (value == "TextArea")
        {
            TextBox DateTextBox = new TextBox() { EnableViewState = false, CssClass = "form-control", TextMode = TextBoxMode.MultiLine, Rows = 5, Columns = 50 };
            e.Row.Cells[3].Controls.Add(DateTextBox);
        }
        if (value == "Content")
        {
            TextBox ContentAreaControl = new TextBox()
            {
                TextMode = TextBoxMode.MultiLine,
                EnableViewState = false,
                Columns = 10,
                MaxLength = 150,
                Height = 200,
                CssClass = "Content-container",
            };

            e.Row.Cells[3].Controls.Add(ContentAreaControl);
        }
    }
}

protected void SaveTemplateDetails(object sender, EventArgs e)
{
    foreach (GridViewRow row in gv.Rows)
    {         
        FieldValue.Value = row.Cells[3].Text.ToString();
         *//I DONT KNOW HOW TO READ THE VALUE*
    }
}

I just want to know how is the proper way to read this dynamically created textbox

Thank you


Solution

  • ASPX Page Code.

    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDataBound="gv_RowDataBound1">
                    <AlternatingRowStyle BackColor="White" />
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox runat="server" ID="selectProspect" Checked="true" />
                            </ItemTemplate>
                        </asp:TemplateField>
    
                        <asp:BoundField DataField="FieldTitle" HeaderText="" />
                        <asp:BoundField DataField="FieldType" HeaderText="FieldType" />
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="RightText" HeaderText="" />
                        <asp:BoundField DataField="TemplatesInfoCode" HeaderText="TemplatesInfoCode" />
                    </Columns>
                </asp:GridView>
    

    Code behind file

       protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    string fieldType = e.Row.Cells[2].Text;
                    TextBox txtData = e.Row.Cells[3].FindControl("TextBox1") as TextBox;
                    switch (fieldType)
                    {
                        case "Date":
                        case "TextBox":
                            txtData.EnableViewState = false;
                            txtData.CssClass = "form-control";
                            break;
                        case "TextArea":
                            txtData.EnableViewState = false;
                            txtData.CssClass = "form-control";
                            txtData.TextMode = TextBoxMode.MultiLine;
                            txtData.Rows = 5;
                            txtData.Columns = 50;
                            break;
                        case "Content":
                            txtData.TextMode = TextBoxMode.MultiLine;
                            txtData.EnableViewState = false;
                            txtData.Columns = 10;
                            txtData.MaxLength = 150;
                            txtData.Height = 200;
                            txtData.CssClass = "Content-container";
                            break;
                    }
                }
            }
            protected void btnSave_Click(object sender, EventArgs e)
            {
                SaveTemplateDetails();
            }
            private void SaveTemplateDetails()
            {
                foreach (GridViewRow row in gv.Rows)
                {
                    foreach (Control c in row.Cells[3].Controls)
                    {
                        TextBox txtDate = c as TextBox;
                        if (txtDate != null)
                        {
                            string data = txtDate.Text;
                        }
                    }
                }
            }