2010-01-10 5 views
1

텍스트 상자와 레이블이있는 간단한 사용자 정의 컨트롤이 있습니다. 다른 양식의 사용자 정의 컨트롤을 사용할 때 텍스트 상자의 텍스트에 액세스하기 위해 공용 속성을 만들었습니다.Windows에서 사용자 정의 컨트롤 양식 응용 프로그램

제 문제는 속성을 폼에서 호출 할 때 null 값을 반환한다는 것입니다. 내가 놓친 게 있니? 다음과 같이 :: 다음과 같이

public partial class UserControl1 : UserControl 
{ 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     public string rtnTxtMake 
     { 
      get 
      { 
       return txtMake.Text; 
      } 
      set 
      { 
       txtMake.Text = value; 
      } 
     } 
} 

하고 다음 형태의 버튼 클릭 이벤트에

내가 속성을 호출

내 속성입니다

 UserControl1 Usc = new UserControl1(); 
     string Make = Usc.rtnTxtMake; 

     MessageBox.Show(Make) 
+1

'txtMake.Text'를 설정 한 적이 있습니까? – Nifle

+0

application.is를 실행할 때 텍스트 상자에 값을 입력하는 것으로 충분하지 않습니까? – Kishore

+0

수동으로 txtMake.Text를 일부 value.i에 할당하면 필요한 output.but을 얻을 수 있습니다. 런타임 중에 txtMake.Text ???????? – Kishore

답변

0
UserControl1 Usc = new UserControl1(); 
string Make = Usc.rtnTxtMake; 

은, 다음이 올 것 같다 위의 그 두 줄의 코드는 사용자 컨트롤의 새 인스턴스를 명시 적으로 만들기 때문에 null 또는 String.Empty (String.IsNullOrEmpty을 통해 확인)을 반환합니다.

나는 당신이 정말로 원하는 것은 가정이 : 당신은 디자이너의 형태로 사용자 정의 컨트롤을 삽입 한

  • . 이 사용자 정의 컨트롤 인스턴스를 ctlUser이라고합시다.

  • Click 이벤트 처리기가있는 단추가 있습니다. 귀하의 질문에 코드의 마지막 몇 줄은 그 처리기 메서드에서 있습니다.

  • 처리기에서 사용자 컨트롤 (Usc)의 새 인스턴스를 만들지는 않지만 이전에 양식에 삽입 한 인스턴스 인 ctlUser을 참조하십시오. 그러면 예상대로 작동합니다.

+0

고마워요 .. 새로운 인스턴스 .. 죄송합니다. – Kishore

0

귀하의 UserControl은의 Controls 컬렉션에 추가해야합니다 부모 폼/컨트롤을 올바르게 초기화 할 수 있습니다. 일반적으로 UserControl을 생성하고 추가하는 코드는 직접 작성하지 않습니다.

대신, 먼저 프로젝트를 빌드 한 다음 기본 폼의 Deisgner보기로 이동하고 도구 상자를보십시오.

사용자 컨트롤 이름 (및 아이콘)이 도구 상자의 맨 위에 나타나야하며 기본 폼으로 끌어 올 수 있습니다. Windows Forms 디자이너는 자동으로 필요한 초기화 코드를 생성합니다.

단추 클릭 이벤트 처리기에서 컨트롤의 새 인스턴스를 만들지 않아야합니다. 다음과 같이 컨트롤을 만드는 디자이너 접근 방식을 사용하면 단순히 컨트롤의 기존 인스턴스에 액세스 할 수 있습니다

public void button_Click(object sender, EventArgs e) 
{ 
    // myUserControl1 has already been created and initialized by the Deisgner generated code 
    // Note the name 'myUserControl1' is just an example, yours may be different. 
    string controlText=myUserControl1.rtnTxtMake; 

    // Or to change the UserControl textbox value 
    myUserControl1.rtnTxtMake="Testing"; 
} 
사용자 컨트롤이 기본적으로 빈 텍스트 상자 필드가있는 경우
+0

@Ash 자주 런타임에 UserControls를 만듭니다. imho : 드문 또는 "비정상적인"관행. 물론, 런타임에 생성 된 컨트롤은 일부 "컨테이너"에 추가 될 때까지 "쓸모없는"상태가 될 것이라는 점을 지적하는 것이 옳습니다. 그러나, 예외가 있습니다 : 나는 런타임을 사용하여 3을 만듭니다. party TreeView 인스턴스 : 컨테이너에 추가되지 않음 : UI TreeView의 선택된 노드를 XML로 저장할 수 있습니다 (TreeView는 전체 TreeView를 XML로만 저장할 수 있음). UI의 TreeView에서 선택된 노드를 "유령"TreeView에 복제하고 "유령"TreeView를 XML로 저장 한 다음 "유령"을 지운다. – BillW

0

속성이 null 값을 반환한다고 말할 때 정확히 무엇을 의미합니까? 그것은 실제로 null입니까, 아니면 MessageBox가 비어있는 것을 보여주는 것입니까?

코드가 빠르게 복제되어 예상대로 작동합니다. MessageBox가 표시되지만 TextBox 컨트롤의 Text 속성 기본값은 빈 문자열이므로 비어 있습니다.

또한 접근 방식은 조금 이상합니다.

첫째, 라인 :

UserControl1 Usc = new UserControl1(); 

당신이하지 일반적으로 같은 사용자 컨트롤을 인스턴스화해야합니다. 대신 컨트롤을 도구 상자에서 폼의 디자인 화면으로 끌 수 있습니다. 그러면 인스턴스를 만들고 컨트롤을 초기화합니다.

위의 코드 줄을 포함 시키면 사용자 정의 컨트롤의 새 인스턴스를 만드는 것이고 이것이 사용자 정의 컨트롤로 리얼리렉션되는 것이 아니라고 생각합니다. 디자이너.

폼의 디자이너보기로 이동하여 사용자 정의 컨트롤을 클릭하면 속성 창이 나타납니다. 표시되지 않으면보기 메뉴에서 선택하거나 F4 키를 누르십시오. 속성 목록에는 "이름"이 하나 있어야합니다.이 이름은 사용자 정의 컨트롤에 대해 생성 된 프로그램 이름입니다. 원하는 경우 여기에서이 값을 변경할 수 있지만 나머지 양식에서이 컨트롤을 참조 할 때는 사용해야합니다. 둘째

, 다음 두 줄은 :

string Make = Usc.rtnTxtMake; 

MessageBox.Show(Make) 

직접 재산 rtnTxtMake에 액세스 할 수 있습니다. 나중에 코드의 나머지 부분에서 Make 문자열에 액세스해야하는 경우가 아니면 일반적으로 속성에 직접 액세스하는 것이 더 나은 스타일로 간주됩니다.

MessageBox.Show(userControl.rtnTxtMake); 
+0

@David, 사소한 관찰 : 변수가 (반드시 개인) 버튼 클릭 처리기의 범위에서 설명되기 때문에 어쨌든 해당 범위 밖에서 변수에 액세스 할 수 없습니다. 물론 변수를 일회용으로 선언하는 것이 맞습니다. 이런 사용법은 시간 낭비입니다. – BillW