ASP.. NET切换控件可见性从代码后面

本文关键字:代码 可见性 控件 NET ASP | 更新日期: 2023-09-27 18:12:56

我有两个问题,我不确定是否相关:

我有两个下拉列表控件(最初设置为不可见)和一个RadioButtonList控件,自动回退行为设置为true。

每当Postback发生时,我想从RadioButtonList控件读取SelectedValue属性-并根据它,使其中一个下拉列表可见。

我的问题是:

1)我不能直接引用RadioButtonList控件的ID。cs文件似乎不会生成RadioButtonList或DropDownList控件。即使我手动将控件添加到designer.cs文件中,它们在重新生成时也会丢失。这是预期行为吗?

2)我试着使用这个页面。在Page_Load()方法中的FindControl属性

if(Page.PostBack==true)
{
    RadioButtonList rbl = (RadioButtonList)Page.FindControl("RadioButtonList1");
    if(rbl.SelectedValue=="optionA")
    {
         DropDownList ddA = (DropDownList)Page.FindControl("DropDownListA");
         ddA.Visible = true;   
    }
    else
    {
         DropDownList ddB = (DropDownList)Page.FindControl("DropDownListB");
         ddB.Visible=true;
    }
}

但是我在if条件下得到一个NullReferenceException。

我完全走错轨道了吗?会有人指导我实现我想做的事情的最好方法吗?

另外,我该怎么做才能使designer.cs文件加载控件?


编辑:/facepalm指

我自己弄明白了。我忘了我是在表中使用控件的。

一旦我将Control移出Table,我就可以直接引用ID了。

缺乏睡眠和咖啡是罪魁祸首。我的歉意。谢谢你的帮助!

ASP.. NET切换控件可见性从代码后面

页面。FindControl不是递归的,也就是说,如果dropdownlist1控件在其他控件中,它将返回null。检查这个链接的详细信息,看看你是否能够找到正确的下拉列表。

http://www.mha.dk/post/Recursive-PageFindControl.aspx

你正在给rb1赋值。你应该检查是否找到了控件。

if(rb1.SelectedValue="optionA") 
应该

if(rb1.SelectedValue != null)
{ 
   if(rb1.SelectedValue == "optionA")
   {
       DropDownList ddA = (DropDownList)Page.FindControl("DropDownListA"); 
       if (ddA != null)
                 ddA.Visible = true;  
   }
} 

如果您不能通过其ID引用控件,并且FindControl失败,则可能是在aspx文件中您的控件缺少runat="server"标记。

是这样吗?