FindControl in ListView inside ItemTemplate

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

LVL 1
7oop4qAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Anurag ThakurTechnical ManagerCommented:
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
Melih SARICAOwnerCommented:
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
abelCommented:
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
JavaScript Best Practices

Save hours in development time and avoid common mistakes by learning the best practices to use for JavaScript.

abelCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
7oop4qAuthor Commented:
@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
abelCommented:
> @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
Rahul Goel ITILSenior Consultant - DeloitteCommented:
In RowDataBinding  event

((Button)e.Controls.FindControl("btnButton")).Visible = false;
Toggle it
0
abelCommented:
@Rahu: see the last three comments where we emphasized that there is no RowDataBinding event.
0
7oop4qAuthor Commented:
Ok that was it! Plain, simple and ready to use :)

Thanks!
0
abelCommented:
Thanks for the follow-up and the grade ;-)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.