Solved

Finding a any control in a GridView

Posted on 2008-06-18
7
2,572 Views
Last Modified: 2013-12-17
I have a GrivView (grd) that sits in a ContentPlaceHolder. I've add various controls - textboxes, radiobuttonlist, checkbox etc -  to grd dynamically.
For example.
When I added a text box and created a textbox of the form "txt" + someValue.ToString() so I can locate it later on.
How do I go about finding these controls so I can get the value from these textboxes or better yet how can I loop through the grd to find all the controls by their id and retrieve the control that has the textbox substring?

Thanks.


Thanks in advance.
0
Comment
Question by:mmassy
  • 4
  • 3
7 Comments
 
LVL 5

Expert Comment

by:scgstuff
Comment Utility
You would name the box whatever you want.  You do not need to dynamically change the textbox name.  You would find it by using:


TextBox txtTesting1 = GridView1.Rows[i].FindControl("txtAnything");
String myValue = txtTesting1.Text.ToString();

To loop through, you would do a for each row in datatable loop and find the value for each one.

Shawn
0
 

Author Comment

by:mmassy
Comment Utility
That doesn't work. The html the textbox created has an id like
ctl00_main_grdSurvey_ctl06_txt2-1-c

The part that says txt2-1-c is the ID I gave the text box when I first load the grid. Remember I'm using a master page and my grid sits in the ContentPlaceHolder.
0
 
LVL 5

Accepted Solution

by:
scgstuff earned 500 total points
Comment Utility
I just tested this and it works great.  Give this a try.  I have added a textbox called txtName as a control in the datagrid.  Here is the code that I put in after the gridview1.databind event.....

        string strTesting = string.Empty;
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            TextBox tb = (TextBox)GridView1.Rows[i].FindControl("txtName");
            strTesting = strTesting.ToString() + ", " + tb.Text.ToString();
        }
        Response.Write(strTesting);

This is how I populated the textbox when it first bound the data....

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if(e.Row.RowType == DataControlRowType.DataRow)
        {
            TextBox txtName = (TextBox)e.Row.FindControl("txtName");
            DataRowView drv = (DataRowView)e.Row.DataItem;
            txtName.Text = drv["customer_address"].ToString();
        }

    }

Let me know if you have any problems with that.

Shawn

0
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 

Author Comment

by:mmassy
Comment Utility
How did u add the control... Did u add it at design time or did you add it using the RowDataBound event?
0
 
LVL 5

Expert Comment

by:scgstuff
Comment Utility
At design...

here is the gridview on the aspx page:

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
              <asp:TemplateField>
                    <ItemTemplate>
                          <asp:TextBox ID="txtname" runat="server"></asp:TextBox>
                    </ItemTemplate>
              </asp:TemplateField>
        </Columns>
</asp:GridView>

I have it autogenerate all the columns from the database, and use the tempate column as the first column just to test with.

Shawn
0
 

Author Comment

by:mmassy
Comment Utility
At design time my grid has nothing but the columns tags and I'm creating adding the controls in the RowDataBoundEvent check the code example. I have to do it this way because I'm add other controls as well base the values I receive from a datatable. I can get then to populate on load but I can't  retrieve the value if I want to submit the form.
protected void grd_RowDataBound(object sender, GridViewRowEventArgs e)

{

    if (e.Row.RowType == DataControlRowType.DataRow)

    {

        TextBox txt = new Textbox();

        txt.ID = "txtName";

        e.Rows.Cells[0].Control.Add(txt)

    }

}

Open in new window

0
 

Author Comment

by:mmassy
Comment Utility
Ok I got it to work (been a few days, sorry for the delay)..

I changed the way I was creating the controls. Instead I used to template field ilike you (Shawn) did in design time but I added the controls I will need and set Visiblie="false".  In the RowDataBound event, which ever control is needed, FindControl and  set Visible="true" ;  See code snippet
Thanks Shawn,

Mark.

<asp:GridView ID="grd" runat="server">

  <Columns>

    <asp:BoundField DataField="Number" ></asp:BoundField>

    <asp:TemplateField>

      <ItemTemplate>

        <asp:Label ID="lblName" runat="server" Visible="false"></asp:Label>

        <asp:TextBox ID="txtName" runat="server" Visible="false" />

        <asp:RadioButtonList ID="rblName" runat="server" Visible="false"></asp:RadioButtonList>

        <asp:CheckBox ID="chkName" runat="server" Visible="false" />

      </ItemTemplate>

    </asp:TemplateField>

  </Columns>

</asp:GridView>
 

//This goes in the RowDataBound event

if(e.Row.RowType == DataControlRowType.DataRow)

{

    //If you need a text box and want to populate it

    if (INeedATextBox)

    {

        TextBox txtName = (TextBox)e.Row.FindControl("txtName");

        txtName.Visible = true;

        DataRowView drv = (DataRowView)e.Row.DataItem;

        txtName.Text = drv["customer_address"].ToString();

    }

    if (INeedACheckBox)

    {

        CheckBox chkName = (CheckBox).e.Row.FindControl("chkName");

        chkName.Visible = true;

        DataRowView drv = (DataRowView)e.Row.DataItem;

        chkName.Text = drv["customer_address"].ToString();

    }

}

Open in new window

0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
DLL in ASP.NET 20 39
Editing XSL files, 2 18
Trouble with References... 5 22
Change data in datatable 8 15
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now