Solved

FindControl in ListView inside ItemTemplate

Posted on 2009-07-07
10
7,054 Views
Last Modified: 2013-12-17
Hi Experts,

I want to find a Button "btnDelete" inside an ItemTemplate of a ListView to control his visibility and couldn't find a way.
Below the aspx and the C# code I tried.

Hope you can bail me out.

7oop4q

PS: Framework 3.5 SP1
aspx:
 
<asp:ListView runat="server" DataKeyNames="pid_sys_Files" ItemPlaceholderID="itemPlaceholder" ID="lvFileList" OnInit="lvFileList_OnInit">
  <LayoutTemplate>
    <table class="gridview" cellpadding="0" cellspacing="0" width="100%">
      <tr class="header">
        <th><asp:Localize ID="Filename" runat="server" meta:resourcekey="Filename"></asp:Localize></th>
        <th><asp:Localize ID="Filesize" runat="server" meta:resourcekey="Filesize"></asp:Localize></th>
        <th><asp:Localize ID="Date" runat="server" meta:resourcekey="Date"></asp:Localize></th>
        <th>&nbsp;</th>
      </tr>
      <tr id="itemPlaceholder" runat="server"></tr>
    </table>
  </LayoutTemplate>
  <ItemTemplate>
    <tr class='<%# Container.DataItemIndex % 2 == 0 ? "row" : "row alt" %>'>
      <td><a href='<%# Eval("pid_sys_Files", "addActions.aspx?document={0}") %>' runat="server"><%# Eval("OriginalName") ?? "&nbsp;"%></a></td>
      <td><%# FormatFS(Eval("FileSize"))%></td>
      <td><%# Eval("DateCreated") ?? "&nbsp;"%></td>
      <td><asp:Button ID="btnDelete" CommandArgument='<%# Eval("pid_sys_Files") %>' OnClick="btnDelete_OnClick" runat="server" meta:resourcekey="DeleteFile" /></td>
    </tr>
  </ItemTemplate>
</asp:ListView>
 
 
C#:
 
// the new instance is always null and I can't find the button inside the Controls array
Control c = lvFileList.Controls[0].FindControl("btnDelete");
 
// this one also
Button BtDelete = ((Button)lvFileList.FindControl("ctl00_ContentPlaceHolder1_TabContainer1_TabFiles_lvFileList_ctrl0_btnDelete"));
BtDelete.Visible = false;
 
// and this one too
(Button)lvFileList.FindControl("btnDelete").Visible = false;

Open in new window

0
Comment
Question by:7oop4q
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
10 Comments
 
LVL 26

Expert Comment

by:Anurag Thakur
ID: 24792019
Did this one worked or not
// this one also
Button BtDelete = (Button)lvFileList.FindControl("btnDelete");
BtDelete.Visible = false;


// and this one too
((Button)lvFileList.FindControl("btnDelete")).Visible = false;
0
 
LVL 19

Expert Comment

by:Melih SARICA
ID: 24792020
ucan access these controls while databinding event..

and u cave to check the typeof the item.. u can not access those controls in item template,in header or footer item..

0
 
LVL 39

Expert Comment

by:abel
ID: 24792202
It will not work to try to find the button using FindControl on the full filelist, because the list will contain many btnDelete controls, one for each list item. To find your control you have basically three options:

1. Use the rowdatabinding event (not sure if ListView has that)
2. Assign an event to the button OnLoad event
3. Loop through all listview items. On each item you can do a FindControl for the controls in that ListViewDataItem

-- Abel --
0
Salesforce Made Easy to Use

On-screen guidance at the moment of need enables you & your employees to focus on the core, you can now boost your adoption rates swiftly and simply with one easy tool.

 
LVL 39

Accepted Solution

by:
abel earned 500 total points
ID: 24792226
Point one above should be: OnItemDataBound event. It gives you the current item while it's being databound. You can use FindControl on the e.Item of the ListViewItemEventArgs:

protected void lvFileList_OnItemDataBound(object sender, ListViewItemEventArgs e)
{
   // get the button or any other control on the current row
   Button deleteButton = (Button) e.Item.FindControl("btnDelete");
   if(deleteButton != null)
   {
       // button can be null for non-dataitem rows
       // do your thing with the button.
   }
}

Open in new window

0
 
LVL 1

Author Comment

by:7oop4q
ID: 24792246
@ragi0017: no both of them hasn't

@non_zero: i tried to acces them on th databound event but I don't know how to access the sender.
You mean i don't have a chance to access the controls inside a template?

@abel: 1. ListView does'n have the RowDataBinding event like GridView has
2. and then what?
3. I will try this. Sounds interesting.

0
 
LVL 39

Expert Comment

by:abel
ID: 24792273
> @abel: 1. ListView does'n have the RowDataBinding event like GridView has
Yes, I checked and saw that too, I also get sometimes confuses with the different terminology Microsoft uses everywhere. See my last comment for what I meant.

> 2. and then what?
Inside the event handler you can cast the sender to a type Button. You can use the Parent (or Parent.Parent) to find the containing control if you need to find other controls, which you can do from there with FindControl again. But point 1 and point 3 are perhaps more straightforward depending on your situation.
0
 
LVL 9

Expert Comment

by:Rahul Goel ITIL
ID: 24792278
In RowDataBinding  event

((Button)e.Controls.FindControl("btnButton")).Visible = false;
Toggle it
0
 
LVL 39

Expert Comment

by:abel
ID: 24792287
@Rahu: see the last three comments where we emphasized that there is no RowDataBinding event.
0
 
LVL 1

Author Closing Comment

by:7oop4q
ID: 31600494
Ok that was it! Plain, simple and ready to use :)

Thanks!
0
 
LVL 39

Expert Comment

by:abel
ID: 24792388
Thanks for the follow-up and the grade ;-)
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
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…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

733 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