Solved

Finding a any control in a GridView

Posted on 2008-06-18
7
2,584 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
ID: 21815226
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
ID: 21816877
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
ID: 21818514
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 

Author Comment

by:mmassy
ID: 21819011
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
ID: 21819037
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
ID: 21819095
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
ID: 21840539
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

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

786 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