FindControl Returning Null
With thanks to Matthew Watson, the FindControl has issues in projects using master pages. In order to find controls within a page, one must first drill down through the master page and its content manually:
This:
Button btn = FindControl(btnName) as Button;
Must take the format:
Button btn = this.Master.FindControl("MainContent").FindControl(btnName) as Button;
nickson104
Updated on August 11, 2022Comments
-
nickson104 over 1 year
I am trying to contol a buttons state depending on a relevant text box. The names are the same other than the prefixes. The text boxes and buttons are located in a table on the page.
<asp:Table ID="Table1" runat="server" CssClass="table"> <asp:TableRow> <asp:TableCell Width="15%"> <asp:Label ID="lblRequestHeader" runat="server" Text="Requested" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Label ID="lblApprovalHeader" runat="server" Text="Approval" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Label ID="lblApprovalTimeHeader" runat="server" Text="Date/Time of Approval" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Label ID="lblReadyHeader" runat="server" Text="Ready To Pick Up" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Label ID="lblCollectedHeader" runat="server" Text="Collected By TestHouse" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Label ID="lblDeliveredHeader" runat="server" Text="Delivered From TestHouse" CssClass="bold text-center" Width="90%"></asp:Label> </asp:TableCell> </asp:TableRow> <asp:TableRow> <asp:TableCell Width="15%"> <asp:TextBox ID="txtRequestTime" runat="server" Width="90%"> </asp:TextBox> </asp:TableCell> <asp:TableCell Width="15%"> <asp:TextBox ID="txtApproval" runat="server" Width="90%"></asp:TextBox> </asp:TableCell> <asp:TableCell Width="15%"> <asp:TextBox ID="txtApprovalTime" runat="server" Width="90%"></asp:TextBox> </asp:TableCell> <asp:TableCell Width="15%"> <asp:TextBox ID="txtReadyTime" runat="server" Width="90%"></asp:TextBox> </asp:TableCell> <asp:TableCell Width="15%"> <asp:TextBox ID="txtCollectedTime" runat="server" Width="90%"></asp:TextBox> </asp:TableCell> <asp:TableCell Width="15%"> <asp:TextBox ID="txtDeliveredTime" runat="server" Width="90%"></asp:TextBox> </asp:TableCell> </asp:TableRow> <asp:TableRow> <asp:TableCell Width="15%"> </asp:TableCell> <asp:TableCell Width="15%"> </asp:TableCell> <asp:TableCell Width="15%"> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Button ID="btnReadyTime" runat="server" Text="Ready To Collect" Width="90%" /> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Button ID="btnCollectedTime" runat="server" Text="Collected" Width="90%" /> </asp:TableCell> <asp:TableCell Width="15%"> <asp:Button ID="btnDeliveredTime" runat="server" Text="Delivered" Width="90%" /> </asp:TableCell> </asp:TableRow> </asp:Table>
The textbox is populated by a dataretrieval, and the state of the button is then set by the called method as follows:
txtReadyTime.Text = slabdetails.ReadyTimestamp.ToString(); textboxenabled(txtReadyTime);
This method modifies the textbox name to a button name, then attempts to find the button to enable/disable it.
public void textboxenabled(TextBox box) { string btnName = box.ID.Replace("txt", "btn"); try { Button btn = FindControl(btnName) as Button; if (box.Text == "") btn.Enabled = true; else btn.Enabled = false; } catch { } }
However, despite the string matching the names of the buttons perfectly, the control returns as null. What can be done to deal with this issue?
-
Matthew Watson about 9 yearsThat won't help... It'll either still return null, or it will throw an exception.
-
M_Griffiths about 9 yearsYou need the speech marks around the button name. Have you tried running it through a debugger with break points?
-
M_Griffiths about 9 yearsAlso where is the button on the page?
-
nickson104 about 9 yearstried to using speech marks around the name, it didnt work sorry: Button btn = FindControl('"' + btnName + '"') as Button;
-
M_Griffiths about 9 yearsNot like that like this FindControl("btnName") as Button;
-
nickson104 about 9 yearsoh i see, forcibly inject a known value to test. Reading that, I thought it was bound to work, unfortunately still returns null
-
M_Griffiths about 9 yearsThen I'd suggest going with what Matthew said in his comment, perform a recursive search. Should work
-
Matthew Watson about 9 yearsYou can mark your own answer as the answer if you want (it will help other people searching for answers to similar questions).
-
BKM about 4 yearsa very proper solution searched many sites and finally found the solution for nested controls
-
liviriniu almost 2 yearsIt helps to be noted that
"MainContent"
refers to the ID of aContentPlaceholder
control inside the master page's .master file and not to the ID of aContent
control inside the page's .aspx file.