2011-01-28 2 views
2

저는 (ASP.NET 3.5, C#을 사용하여) 사용자 정의 컨트롤을 만들고 있습니다.FindControl()에서 NullReferenceException을 발생시키는 원인은 무엇입니까?

이 컨트롤은 대체로 다른 비슷한 컨트롤을 기반으로합니다 (불행히도 이것을 상속하는 쉬운 방법은 없습니다). 나를 괴롭히는 선은 대부분의 디스플레이와 마찬가지로 다른 컨트롤에서 직접 복사됩니다. 다음 코드

관련 라인은 다음과 같이 ltrAvailableCount 위에서

Panel pnlForm = (Panel)e.Item.FindControl("pnlForm"); 
Literal ltrAvailableCount = (Literal)e.Item.FindControl("ltrAvailableCount"); 

DropDownList drpLanguage = (DropDownList)pnlForm.FindControl("drpLanguage"); 
DropDownList drpShipTo = (DropDownList)pnlForm.FindControl("drpShipTo"); 
HiddenField hdnAvailableProductId = (HiddenField)pnlForm.FindControl("hdnAvailableProductId"); 

DropDownList drpQuantity = (DropDownList)pnlForm.FindControl("drpQuantity"); 
HiddenField hdnSelectedStyle = (HiddenField)e.Item.FindControl("hdnSelectedStyle"); 
Label lblStyleName = (Label)e.Item.FindControl("lblSelectedStyle"); 
pnlForm

을 정확하게 알 수있다.

drpQuantity으로 건너 뛸 때 그 줄과 다음 줄이 올바르게 작동합니다. 그러나 drpLanguage, drpShipTo 또는 hdnAvailableProductIdFindControl에 대한 행을 실행할 때 NullReferenceException을 던집니다.

'null'을 반환하고 반환 된 개체의 속성에 액세스하려고 시도하지 않습니다. 메서드 FindControl이 예외를 throw합니다. MSDN 라이브러리에 따르면 이것은 가능하지 않습니다. FindControl은 잠재적 인 오류가 발생했음을 표시하지 않으며 Control을 찾을 수 없으면 null을 반환합니다.

NullReferenceException에 FindControl이 발생할 수있는 원인은 무엇입니까?

----------------- 편집 ---------------

나는 또한 언급해야

것을 내가 실행하면 어떤 바로 가기 창에서 문제가되는 세 줄 중 올바른 결과를 얻을 수 있습니다. 디버깅 중에 검사 할 때 ControlCollectionpnlForm의 컨트롤을 볼 수도 있습니다.

---------------

그냥 확인하고, 다른 줄을 추가했습니다 : DropDownList notThere = (DropDownList) pnlForm.FindControl ("notHere"); 컨트롤 notHere은 페이지의 어느 부분에도 없습니다. 위의 줄은 (물론) 컴파일되고 디버거를 실행하면 정상적으로 실행됩니다. 캐스트가 잘됩니다. 변수 notThere은 단순히 null입니다.

이 문제의 근본 원인이다 NOT 컨트롤을 찾기 위해 실패하고 그것이합니다() 컨트롤을 찾지의

+1

당신이 pnlForm가 null이 아닌 확신 (새끼 고양이가 그것을 사용하는 사망) .... 전 세계적으로 학대하는 기능입니다? 디버깅 중에 다시 확인하십시오. – jrummell

+0

FindControl을 호출하는 객체 중 하나가 null이 아닌 것이 확실합니까? –

+0

FindControl()이'null'을 반환한다고 상상해보십시오. 캐스트가 'DropDownList'작업에 사용됩니까? 나는 단지 내가 생각하고있는 것을 타이핑하고있다 ... – Bazzz

답변

8

그것은 그 문제의 원인의 FindControl되지 않습니다 :

시도 (이 찾고있는 사람이 있었다).

코딩 방법에 따라 FindControl()과 컨트롤 데이터 유형에 대한 캐스팅이 한 줄에 두 가지 작업을 수행합니다. FindControl 호출의 결과가 null 값이고 null을 컨트롤에 캐스팅하려고 시도하기 때문에 폭주가됩니다.

이 하나

나에게 여러 번 비트, 그래서 나는 예외가 발생하는있는 DropDownList에 null 캐스팅

object oDropDown1 = pnlForm.FindControl("DropDown1"); 

// then check if oDrowpDown 1 is null and cast if it's safe. 

if(oDropDown1 != null) 
{ 
    // here it's safe to cast. 
} 
+0

저는 이것이 사실이라고 생각하지 않습니다 -이 패턴은 우리 프로젝트 전체에서 사용되고, 다른 모든 경우에, 우리는 캐스트가 훌륭하다는 것을 보았습니다 (비록 드롭 다운리스트/label/control이 null 임). 게다가, 그것이 무효 캐스트의 경우, 확실히 NullReferenceException는 아니고 InvalidCastException를 Throw합니다. – Jeff

+0

코드를 수정하여 예제처럼 보이게하고 디버거가 DropDownList로 본 객체를 반환했습니다. 널 확인 후 캐스트가 실패했습니다. – Jeff

+0

좋아요, 그래서 적어도 캐스트가 실패하고 FindControl()이 아님을 압니다. 이제 올바른 장소를 볼 수 있습니다. – David

0

당신은, NullReferenceException이를 얻을 DropDownList로 또는 기타 제어에 null을 캐스팅하려고 노력의 FindControl

DropDownList drpLanguage = (DropDownList)(pnlForm.FindControl("drpLanguage")); 
DropDownList drpShipTo = (DropDownList)(pnlForm.FindControl("drpShipTo")); 
HiddenField hdnAvailableProductId = (HiddenField)(pnlForm.FindControl("hdnAvailableProductId")); 
+0

http://msdn.microsoft.com/en-us/library/486wc64h.aspx 아니오, 그렇지 않습니다. NRE를 던지는 것과 같지 않은 Null을 반환합니다. – Jeff

+2

당신이 그것을 캐스팅하려고한다면, NRE를 얻습니다. –

5

로 코딩을 배웠습니다.

경우 pnlForm.FindControl("drpQuantity") 반환 당신이 캐스팅 할 수 null)

그러나이 작동합니다

System.Web.UI.WebControls.DropDownList drpQuantity = 
    pnlForm.FindControl("drpQuantity") as System.Web.UI.WebControlsDropDownList; 

if(drpQuantity!=null){ 
    //use drpQuantity here 
} 

을 운영자가 호환되는 형식 사이의 변환을 수행하는 데 사용되는 경우, AS 운영자는 제외 캐스트처럼 예외를 발생시키는 대신 변환 실패시 null을 생성합니다. 다른 모든 케이스에서 제어 된 UserControls와 통신 할 interface (-implementation)를 사용

어쨌든, findcontrol의 사용은, 데이터 생성 제어위한 것이다.

이럴 findcontrol

+0

이것은 repeater의 ItemCommand 내에서 사용되고 있습니다. 이는 데이터가 의미하는 것입니다 - 생성? 또한이 줄은 UserControl 코드 숨김에서 포함 된 페이지에서 액세스하지 않습니다. – Jeff

+0

DropDownList drpLanguage = pnlForm.FindControl ("drpLanguage") as DropDownList; 동일한 예외를 제외하고는 실패합니다. David Stratton이 제안한 수정 된 코드를 실행하려고 시도했을 때이 행에 대해 반환 된 객체 FindControl을 검사했습니다. null이 아니므로 DropDownList를 DropDownList로 형 변환하지 못했습니다. – Jeff

+0

업데이트 : System.Web.UI.WebControls를 네임 스페이스로 추가했습니다. 아마도 DropDownList가 System.Web.UI.WebControls.DropDownLIst이 아니기 때문입니다. –

관련 문제