ASP.NET切换控制后面的代码可见性

时间:2011-10-29 08:54:24

标签: c# asp.net code-behind

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

我有两个DropDownList控件(最初设置为不可见)和一个将autopostback行为设置为true的RadioButtonList控件。

每当发生回发时,我想从RadioButtonList控件中读取SelectedValue属性 - 并根据该属性,使其中一个DropDownLists可见。

这是我的问题:

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

2)我尝试在Page_Load()方法中使用Page.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

我自己想通了。我忘记了,而不是在桌子内使用控件。

一旦我将控件移到桌子外面,我可以直接引用ID。

缺乏睡眠和咖啡。我很抱歉。谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

Page.FindControl不是递归的,即如果dropdownlist1控件在某个其他控件中,它将返回null。 请查看此链接以获取详细信息,并查看您是否能够正确找到下拉列表。

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

答案 1 :(得分:0)

您正在为rb1.SelectedValue分配一个值,您应该检查是否找到了控件。

if(rb1.SelectedValue="optionA") 

应该是

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

       if (ddA != null)
                 ddA.Visible = true;  
   }
} 

答案 2 :(得分:0)

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

是这样的吗?