2011-12-16 3 views
2

여기 덕분에 반복적으로 내 winform의 모든 컨트롤을 반복하고 내 하위 클래스 컨트롤을 찾을 수 있지만 사용자 정의 속성 _key 및 _value를 업데이트하려고 할 때 감사합니다. 객체 Ctrl 키를 노출하지 않습니다 :(내가 ctrlContainer을 사용하고 를 아래이winforms 컨트롤에서 새로운 하위 클래스 속성을 찾을 수 없습니다.

foreach (Control ctrl in ctrlContainer.Controls) 
{ 
    // code to find my specific sub classed textBox 
    // found my control 
    // now update my new property _key 
    ctrl._key does not exist :(

    I know the ctrl exists and is valid because ctrl.Text = "I've just added this text" works. 
    _key is visible when looking at the control in the form designer. 
} 

내가 잘못 어떤 사람이 나에게에 대한 힌트를 줄 수 있습니까? 감사로 전달 호출하는 형태입니다.

답변

3

참조가 유형이이므로 0 (foreach (Control ctrl), 내가 추측하고있는 것은 하위 분류 컨트롤이 아닙니다. 그 참조는 그것에 속한 멤버들만 이해할 것이며, 아마도 _key은 파생 클래스에 속할 것입니다. 이것을 시도하십시오 :

foreach (Control ctrl in ctrlContainer.Controls) 
{ 
    // code to find my specific sub classed textBox 
    // found my control 
    // now update my new property _key 
    if (ctrl is MyControl) 
    { 
     MyControl myControl = (MyControl)ctrl; 
     myControl._key = ""; 
    } 
} 

또는 Sebastian에서 제안한대로 컨트롤의 인스턴스 만 찾을 수 있도록 반복기를 변경할 수 있습니다. 이것은 더 깨끗한 코드입니다.

+0

이 사람이 나를 위해 일 . – Hunt

4

_key은 (는) Control을보고 있기 때문에 존재하지 않습니다. 일을

시도 : foreach는 (ctrlContainer.Controls.OfType ()에서 VAR Ctrl 키)가 제어 예를 들어, 그룹 상자 내부의 텍스트 상자를 찾았다 코드를 엉망 때문에

foreach (var ctrl in ctrlContainer.Controls.OfType<MyControl>()) 
{ 
    ctrl._key = "somthing"; 
} 
+0

그런 식으로, 당신은 현재 컨트롤 타입의 컨트롤을위한 컨테이너를 반복 할 뿐이며, 이는'_key' 속성을 갖습니다. 질문에 게시 한 방식대로하면 모든 컨트롤이 실제로는 해당 유형이 아니라는 것을 보증 할 수는 없습니다. –

+0

결과 반복이 동일하고 모든 유형이 검사됩니다. 그러나 linq 버라이어티는 iterator 자체에 체크를 포함하는 반면, 그렇지 않으면 내 대답에 따라 수동으로 체크해야 할 것입니다. 즉, 나는 Linq 방식 +1을 선호한다. –

+0

@AdamHouldsworth의 경우를 대비하여, 내 대답은 지금 당신이 말한 것이라고 생각하는 삭제 된 주석에 대한 것입니다. –

관련 문제