2013-06-19 4 views
0

동일한 양식을 사용하여 새 데이터를 입력하고 기존 레코드를 입력합니다. 공급 업체, 재고 항목, 고객 등. 편집 모드에서 모든 텍스트 상자를 읽기 전용으로 설정하고 사용자가 편집 할 레코드를 선택하면 읽기 전용 상태를 false로 재설정합니다. 양식에는 여러 탭 (Telerik의 PageViewPage)이 포함될 수 있습니다. 각 탭에는 읽기 전용 true/false로 설정해야하는 여러 편집 가능한 컨트롤이 포함되어 있습니다.메소드에 대한 매개 변수로 다른 컨트롤 보내기

이 코드를 사용하여 컨테이너 배열을 FormControl이라는 클래스에 보냅니다.

RadGroupBox [] containerList = { this.pageGeneral, this.pageBankDetail, this.pageContact }; 
FormControl.ControlsReadOnly(containerList, false); // /truefalse to set Read-only status 

FormControl 클래스에는 읽기 전용 상태를 설정하는 다음 코드가 있습니다.

public static void ControlsReadOnly(RadGroupBox [] containerList, bool readOnlyStatus) 
    { 
     var container = (containerList[0] as RadGroupBox); 

     for (int i = 0; i < containerList.Length; i++) 
     { 
      foreach (var control in container.Controls) 
      { 
       RadTextBox textEdit = control as RadTextBox; 
       if (textEdit != null) 
       { 
        textEdit.ReadOnly = readOnlyStatus; 
        continue; 
       } 

       RadMaskedEditBox textMasked = control as RadMaskedEditBox; 
       if (textMasked != null) 
       { 
        textMasked.ReadOnly = readOnlyStatus; 
        continue; 
       } 

       // rest of the code 

코드는 잘 작동하지만 명백한 단점은 컨테이너가 RadGroupBox 인 경우에만 작동한다는 것입니다. 폼, 그룹 상자 및 PageViews 호출 형식의 컨트롤 형식을 변경하여 처리 할 동일한 코드를 사용하고 싶습니다.

답변이 Reflection을 포함 할 것으로 생각되지만 해결할 수 없습니다. FormControl 메서드에서 매개 변수 목록을 Control [] containerList로 대체하려고 시도했지만 더 이상 var 변수를 사용할 수 없습니다.

+0

제네릭을 만드는 데 어려움을 겪고있는 것처럼 보입니다. 당신은'var container = (containerList [0] as RadGroupBox); '를 다른 타입들로 대체해야하지 않을까요? 이것은 아마도 단일 방법이 되기에는 너무 어려울 것입니다. 오버로드를 고려한 다음 각 오버로드 (수신기) 내에서 공통 메소드를 호출하십시오. – DonBoitnott

+0

그건 내 첫 번째 생각이었고 실제로 어떻게 구현했는지 각 가능성에 대한 하나의 방법이었습니다. 과부화가 작동 할 수도 있지만 확인하겠습니다. – PeterJ

답변

0

@ChrisC가 정확합니다. RadGroupBox는 컨트롤 클래스에서 상속 받고 컨트롤 클래스는 Controls 속성을가집니다.

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus) 
{ 

} 

내가 이해하지 못하는 한 가지 : 배열의 길이만큼 동일한 컨트롤을 왜 보입니까? 이것을 찾으 셨나요?이 도움이된다면

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus) 
{ 


    for (int i = 0; i < containerList.Length; i++) 
    { 
      var control = containerList[i]; 
      //... omitted code for brevity 
    } 

} 

마지막으로, 나는 모르겠지만, 어떤 제어 Enabled 될 수 있습니다. 이렇게하면 액세스가 일관되게 유지되어 다음과 같은 작업을 수행 할 수 있습니다.

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus) 
{ 
    foreach (var control in container.Controls) 
    { 
      foreach (var control in container.Controls) 
      { 
       if((control as RadTextBox) != null) 
       { 
       control.Enabled = !readOnlyStatus; 
       } 
      } 
    } 
} 

이 정보가 도움이되기를 바랍니다.

출처 :

여기

http://www.telerik.com/help/winforms/t_telerik_wincontrols_ui_radgroupbox.html http://msdn.microsoft.com/en-us/library/system.windows.forms.control.aspx

+0

for ... 루프는 전달 된 컨테이너 수를 반복하고 foreach() 루프는 각 컨테이너의 컨트롤을 반복합니다. enabled 속성에 관해서 : 나는 절대적으로 비활성화 된 컨트롤에 의해 가정 된 어두운 회색을 경멸하므로 읽기 전용 속성을 선호합니다. – PeterJ

+0

Todd의 도움으로 알아 냈습니다! 내 질문에 답변 할 수있게되면 (5 시간 정도) 응답을 게시합니다. 감사합니다. Todd! – PeterJ

+0

나는 약간 통찰력을 제안 할 수 있었다. –

1

나는 RadBox (Telerik stuff?)가 아니라 가장 일반적인 클래스를 찾기 위해 상속 체인을 크롤링합니다. 즉, 조작하려는 모든 컨트롤을 동일한 기본 클래스에서 상속합니까? ?

ReadOnly 속성은 어디에 정의되어 있습니까? RadBox에만있는 경우 운이 좋지 않을 수 있습니다. 그러나 RadBox가 상속받은 무언가에 존재하는 경우 메서드를 대신 해당 유형의 컬렉션을 수락하는 것으로 정의해야합니다.

예를 들어, Readonly 속성이있는 BaseControl 클래스가 있고 거기에서 RadBox가 상속 된 경우 "BaseControl [] ContainerList"를 전달하면됩니다. 궁극적으로 객체를 기본 유형으로 전달할 수 있습니다.

이게 뭐죠?

+0

OK 덕분에, 그것은 깔끔한 접근법처럼 보이고 확실히 작동 할 수있었습니다. 이제는 공통 클래스를 찾아야합니다. 이는 까다로운 작업 일 수 있습니다. – PeterJ

0

내가 그것을 구현하는 방법, 그리고 그것을 잘 작동합니다.

public static void ControlsReadOnly(Control [] containerList, bool readOnlyStatus) 
    { 
     for (int i = 0; i < containerList.Length; i++) 
     { 
      foreach (var control in containerList[i].Controls) 
      { 
       // ignore labels 
       if ((control as RadLabel) != null) 
       { 
        continue; 
       } 

       // other editable controls 
       else if ((control as RadTextBox) != null) 
       { 
        (control as RadTextBox).ReadOnly = readOnlyStatus; 
        continue; 
       } 

       else if ((control as RadMaskedEditBox) != null) 
       { 
        (control as RadMaskedEditBox).ReadOnly = readOnlyStatus; 
        continue; 
       } 

       // rest of code 

도움 주셔서 감사합니다.

관련 문제