2013-06-19 3 views
0

Я использую ту же форму для ввода новых данных и ввода существующих записей, например. для поставщиков, предметов запаса, клиентов и т. д. В режиме редактирования я устанавливал все текстовые поля только для чтения, и как только пользователь выбрал запись для редактирования, я возвращаю статус только для чтения на значение false. Форма может содержать несколько вкладок (или PageViewPages в Telerik), каждая из которых содержит несколько редактируемых элементов управления, которые должны быть установлены только для чтения 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] как 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

Я не familaiar с RadBox (материал Telerik?), Но сканирую цепочку наследования, чтобы найти самый низкий общий класс - то есть все ваши элементы управления, которые вы хотите манипулировать наследованием от одного и того же базового класса ?

Где определяется свойство 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 

Благодарим за помощь!

 Смежные вопросы

  • Нет связанных вопросов^_^