FindControl返回空值

9

我正在尝试根据相关文本框控制按钮的状态。除了前缀之外,它们的名称相同。文本框和按钮位于页面上的表格中。

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

文本框由数据检索填充,然后调用的方法设置按钮的状态如下:
txtReadyTime.Text = slabdetails.ReadyTimestamp.ToString();
textboxenabled(txtReadyTime);

这个方法会将文本框的名称修改为按钮的名称,然后尝试查找该按钮并启用/禁用它。

 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
        {
        }
    }

然而,尽管字符串完美匹配按钮名称,但控件返回为null。那么如何处理这个问题?


1
你用调试器逐步执行过它吗? - horHAY
1
如果你执行 object obj = FindControl(btnName);,那么它会返回 null 吗? - Matthew Watson
搜索对象也会返回空值。 - nickson104
1
好的,你正在寻找的控件不存在。它可能在你正在搜索的页面内的一个容器中吗?也许你需要进行递归搜索,就像这里所示 - Matthew Watson
这是关键!谢谢您,马修,请将其放在答案中,以便我可以选择它?解决方案: Button btn = this.Master.FindControl("MainContent").FindControl(btnName) as Button; - nickson104
我本来不会猜到你必须手动从主页面钻取某些在页面上显示的内容,毕竟'this'应该自动引用那个钻取吧? - nickson104
4个回答

25

感谢Matthew Watson,在使用母版页的项目中,FindControl存在问题。为了找到页面内的控件,必须手动浏览母版页及其内容:

这样做:

  Button btn = FindControl(btnName) as Button;

必须采用以下格式:

  Button btn = this.Master.FindControl("MainContent").FindControl(btnName) as Button;

如果您愿意,您可以将自己的答案标记为答案(这将有助于其他寻找类似问题答案的人)。 - Matthew Watson
搜索了许多网站,最终找到了嵌套控件的非常适当的解决方案。 - BKM
1
需要注意的是,"MainContent" 是指主页面 .master 文件中的 ContentPlaceholder 控件的 ID,而不是页面 .aspx 文件中的 Content 控件的 ID。 - liviriniu

0

正在为我工作...

protected void Page_Load(object sender, EventArgs e)
{

   // txtReadyTime.Text =""; //Button will be enabled
    txtReadyTime.Text =DateTime.Now.ToShortTimeString(); //Button will be enabled
    textboxenabled(txtReadyTime);


    //Button btn = this.FindControl("btnReadyTime") as Button;
    //Title = btn.Text;
}

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
    {
    }
}

0
尝试以下代码: Button btn = (Button)Table1.FindControl("btnName");
编辑: 由于你在控件内查找一个控件,所以需要执行上述操作。

那样做没有帮助……它要么仍然返回null,要么会抛出异常。 - Matthew Watson
你需要在按钮名称周围添加引号。你尝试过用断点调试它吗? - M_Griffiths
页面上的按钮在哪里? - M_Griffiths
尝试在名称周围使用引号,但很抱歉它没有起作用:Button btn = FindControl('"' + btnName + '"') as Button; - nickson104
哦,我明白了,强制注入已知值进行测试。看到那个,我原以为它能正常工作,但不幸的是仍然返回空值。 - nickson104
显示剩余2条评论

0
please see you : https://mousavi6622.ir/en/


using System.Web;   
using System.Web.UI;

    public class FindControlService
    {
        Page page;
        public FindControlService(string id) {
            page = HttpContext.Current.Handler as Page;
        }
        public  static Control get(string id) {
            FindControlService fcr = new FindControlService(id);
            return fcr.FindControlRecursive(fcr.page, id);
        }
        private Control FindControlRecursive(Control root, string id)
        {
            if (root.ID == id)
            {
                return root;
            }

            foreach (Control c in root.Controls)
            {
                Control t = FindControlRecursive(c, id);
                if (t != null)
                {
                    return t;
                }
            }

            return null;
        }
    }
-----------------------

using : 

   

if (FindControlService.get("txtCountry")!= null)
{
   //
}

你应该添加解释。 - Super Kai - Kazuya Ito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接