2010-11-19 8 views
1
Panel pnl_Confirmation = (Panel)form1.FindControl("ConfirmationPanel") as Panel; 
    pnl_Confirmation.Visible = false; 

위의 코드에서 "NullReferenceException"이 계속 나타납니다. "ConfirmationPanel"은 양식이 성공적으로 제출되었는지 여부에 따라 표시/숨기기 패널입니다.Null 참조 예외 - 왜?

<asp:LoginView ID="LoginView1" runat="server"> 
<LoggedInTemplate> 
<asp:Panel id="ConfirmationPanel" runat="server" Wrap="False"> 

...

왜 널은 다음과 같습니다

패널은 내가 직접 "ConfirmationPanel"를 호출 할 수 없습니다 이유가하는 LoginView 제어에 싸여? ID가 "ConfirmationPanel"인 Panel을 참조해야합니다. 당신이 그 코드가 어디

감사

+2

'Panel pnl_Confirmation = (Panel) form1.FindControl ("ConfirmationPanel") as Panel; – Gabe

+1

이것은 사용자가 원하는 주석이 아니지만 대신 MVC로 작업 할 수있는 방법이 있습니까? ASP.NET webforms는 집중력이 약합니다. – Juliet

+1

두 가지 유형의 캐스트가 필요하지 않습니다. "패널로"이면 충분합니다. – TreDubZedd

답변

4

시험해보기 :

Panel pnl_Confirmation = LoginView1.FindControl("ConfirmationPanel") as Panel; 
if(pnl_Confirmation != null) 
    pnl_Confirmation.Visible = false; 
+0

이것은 효과가 있습니다. 감사! 그것은 "LoginView1"대신 "form1"에서 참조하는 것뿐만 아니라 두 번 주조하고있는 것처럼 보입니다. – Kolten

+0

@Kolten - 네. 귀하의 문제가 해결되면 답변으로 표시하십시오. – Gabe

2

는 모든 것이 달려있다. Page_Load()가 있기 전에 컨트롤 트리가 아직 작성되지 않았으므로 null 참조입니다.

0

두 번 유형 변환하려고합니다. 단 하나 한 번 캐스트에

봅니다 가장 잘 작동합니다

Panel pnl_Confirmation = (Panel)form1.FindControl("ConfirmationPanel"); 

또는

Panel pnl_Confirmation = form1.FindControl("ConfirmationPanel") as Panel; 

또한 중요하다을 참조 그것에게

if (pnl_Confirmation != null) 
    pnl_Confirmation.Visible = false; 
에 액세스를 시도하기 전에 널 (null)인지 여부를 확인하기 위해
1

사용 의의 FindControl LoginView 대신

Panel pnl_Confirmation = LoginView1.FindControl("ConfirmationPanel") as Panel; 

는 LoginView 템플릿의 일부이기 때문에.

1

"의 FindControl는 컨트롤이 직접 지정된 컨테이너에 포함 된 경우에만 컨트롤을 찾을 것이다. 그 방법은 컨트롤 내에서 컨트롤의 계층 구조를 통해 검색하지 않습니다이다"(MSDN 설명서에서)

즉, LoginView에서 FindControl을 호출하거나 재귀 FindControl을 만듭니다.