2009-09-02 10 views
0

클래스의 파일에서 폼 컨트롤에 액세스하려고하는데 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 메시지가 계속 나타납니다.클래스 내부에서 컨트롤에 액세스

별로 어디서부터 내가 여기에 실패 해요하지만이 코드입니다 :

public static void openPage(Page page) 
{ 
    DropDownList eventType = (DropDownList)page.FindControl("eventType"); 
    if (eventType.SelectedItem.Text == "Big Party") 
    { 
     DoSomeWork(); //should be changing values or visible options on the page 
    } 
} 

그리고 나는 그렇게처럼 내 페이지에서 호출 해요 :

Workflow.openPage(this); 

그것은 내 얘기 계속하는 문제의 출처는 다음과 같습니다. if (eventType.SelectedItem.Text == "Big Party")
아이디어가 있으십니까?

+0

VSS에서 debug를 실행하고 watchlist에 eventType.SelectedItem.Text를 넣으면 변수가 감시 목록에 표시 될 때 어떤 값이 표시됩니까? – gsirianni

+0

컨트롤을 찾으려고하는 페이지의 .aspx 마크 업 소스를 보여 주시면 감사하겠습니다. –

+0

@Matthew - 페이지 길이가 2600 줄을 넘었습니다 (코드 숨김이 아님). 나는 할 수 있다고 생각하지 않는다. 그러나 그 중 일부를 잘라내어 필요한 것을 게시하는 방법에 대해 알아 보겠습니다. @ gsirianni - 내가 그걸로 무엇을 할 수 있는지 알아 보겠다. –

답변

1

당신이 얻을 수있는 이유 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다." FindControl이 null을 반환하고 null 참조에 대해 derefrence를 시도하기 때문입니다. 코드 앞에 null 체크가 있으면 예외를 throw하는 것을 중지합니다.

if (eventType != null && eventType.SelectedItem.Text == "Big Party") 
{ 
    DoSomeWork(); //should be changing values or visible options on the page  
} 

물론 이것은 당신이 찾고 싶지 않을 것입니다.

어디에서 Workflow.openPage를 호출하고 있습니까? 페이지 수명주기의 너무 일찍부터 호출하고 있으며 컨트롤이 아직 작성되지 않은 것 같습니다.

+0

바로 돈입니다. 실제로 gsirianni의 코멘트를 기반으로 이것을 알아 냈습니다. 컨트롤에 값이 있지만이 코드를 호출 할 때 값이 채워지지 않습니다. 조엘의 대답은 정확했지만 당신이 더 자세히 설명했기 때문에 대답을 주셨습니다. –

1

page.FindControl()이 (가) null입니다. 그것은 내가 어쨌든 봐야 할 첫 번째 장소가 될 것입니다. 컨트롤 이름을 올바르게 입력했는지,이 메서드를 호출 할 때 수명주기의 시점에 페이지에 컨트롤이 있는지 확인하십시오.

+0

그렇지 않은 경우 아직 항목이 선택되지 않은 것일 수 있습니다.이 경우 'SelectedItem'은'null '이됩니다 –

+0

@ 대니얼 예 이미 항목이 선택되어 있습니다. @ 조엘은 VS에서 말할 수있는 한 정확한 소스 이름을 볼 수 있습니다. –

0

내 생각 엔 페이지에 eventType이라는 컨트롤이 있지만 이름 지정 컨테이너에 있고 FindControl 메서드가 그 이유 때문에 해당 컨트롤을 찾지 못했을 것입니다.

그래서 eventType이 null이므로 null.SelectedItem Null 참조 예외를 발생시킵니다.

마스터 페이지를 사용 중이며 하위 페이지에 대한 컨트롤을 찾고있는 경우 가장 확실합니다. 당신이해야 할 것은하는 INamingContainer를 구현하는 적절한 제어, 보통의 ContentPlaceHolder

ContentPlaceHolder namingContainer = Page.PreviousPage.Controls(0).FindControl("ContentPlaceHolder1"); 

를 검색하고 당신이 찾고있는 컨트롤에 거기에 볼 수 있습니다.

DropDownList eventType = namingContainer.FindControl("eventType"); 

다음은 명명 컨테이너에 대한 소개 기사이며 둘 이상의 명명 컨테이너가있는 페이지에서 FindControls를 만드는 방법입니다.

http://aspadvice.com/blogs/joteke/archive/2006/08/12/20546.aspx

http://visualstudiomagazine.com/articles/2008/05/14/using-findcontrol-and-previouspage-with-master-pages.aspx

+0

양식 태그 바로 아래에 있습니다. –

+0

이것은 masterpage/content 페이지에도 없습니다. 그냥 평범한 양식이야. –

+0

ContentPlaceHolders보다 INamingContainer를 구현하는 컨트롤이 많이 있습니다. 그러나 당신은 내가 잘못된 나무를 짖고 있음을 보장 할 수 있습니다. 컨트롤에는 NamingContainer라는 속성이 있습니다. "eventType"의 이름 지정 컨테이너가 실제로 페이지라고 생각하는 것처럼 보일 것입니다. 실제로 null이 반환되므로 App_Code 클래스가 아니라 실제 출처 페이지에서 확인해야합니다. –

관련 문제