2013-06-19 34 views
0

我使用相同的表單輸入新數據並輸入現有記錄,例如,對於供應商,庫存項目,客戶等。在編輯模式中,我將所有文本框設置爲只讀,並且一旦用戶選擇了要編輯的記錄,我將只讀狀態重置爲false。表單可能包含多個選項卡(或Telerik中的PageViewPages),每個選項卡都包含許多可編輯控件,必須將其設置爲只讀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。

我懷疑答案會涉及反思,但我無法解決它。我試圖用FormControl方法中的參數列表替換Control [] containerList,但是我不能再使用var變量。

+0

在我看來,你會有一個艱難的時間,使這種通用。你不需要將var container =(containerList [0]替換爲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()循環遍歷每個容器中的控件。關於啓用的屬性:我絕對鄙視禁用控件所呈現的深灰色,所以我更喜歡只讀屬性。 – PeterJ

+0

在託德的幫助下,我明白了! 一旦我被允許回答我自己的問題,我會盡快發佈答案(大約五個小時左右)。 謝謝託德! – PeterJ

+0

很高興我能提供一些見解。 –

1

我不是用RadBox(Telerik的東西?)familaiar,但爬行繼承鏈來找到最低的普通類 - 也就是說,做你想操縱的所有控件繼承從相同的基類?

定義的ReadOnly屬性在哪裏?如果它只存在於RadBox上,那麼你可能會失敗。然而,如果它存在於RadBox繼承的東西上,那麼你所要做的就是將你的方法定義爲接受這些類型的集合。例如,如果有一個BaseControl類具有Readonly屬性,並且RadBox從那裏繼承,只需傳入「BaseControl [] ContainerList」。最終,您可以隨時傳遞一個對象,因爲它是基本類型。

這是你想找的東西嗎?

+0

好的,謝謝,這看起來像一個整潔的方法,可以肯定的工作。我現在需要找到常見的類,這可能會很棘手。 – 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 

感謝您的幫助!

相關問題