Как установить свойства включить на ложь для самого текстового поля в форме с поставщиком расширителя. {C #, Winforms} - PullRequest
0 голосов
/ 03 октября 2010

У меня есть 30 текстовых полей и другой элемент управления на winform, и я хочу иногда установить их свойства (включить, видимый) на true / false Я не делаю дубликат кода. Я новичок в winforms, и я хотел бы знать, что является хорошим решением для этой проблемы. Я хотел бы использовать поставщика удлинителя, но я бы знал, подходит ли он. Извините за мой английский. :)

Если кто-то может дать мне пример кода, я буду очень признателен.

Ответы [ 4 ]

1 голос
/ 03 октября 2010

IExtenderProvider не является подходящим решением для этого, он должен был добавить новые свойства в существующие элементы управления.Общий подход довольно прост: используйте Panel.Поместите все элементы управления, которые вы хотите отключить или скрыть в этой панели.И установите для свойства Visible или Enabled панели значение false.Это автоматически отключит все дочерние элементы управления панели.И когда вы скрываете панель, ее дочерние элементы тоже будут скрыты.

0 голосов
/ 25 мая 2011

Вы можете рассмотреть подкласс Textbox и добавить свои собственные свойства:

class MyTextbox : Textbox {
    public bool MyEnable {
        get{ return someBool; }
        set {
            if (yourConditionIsMet) {
                someBool = value;
                this.Enabled = value;
            }
        }
    }
}

... затем переберите все элементы управления в вашей форме:

foreach (Control control in this.Controls) {
    if (control is MyTextbox)
        control.MyEnable = true;
}
0 голосов
/ 25 мая 2011

Вот как я сделал что-то подобное:

В базовом классе формы, от которого наследуются мои формы (который, в свою очередь, наследует от формы) ....

#region Form Fields Enablers

protected virtual void EnableFormFields(Control ctl)
{
  EnableFormFields(ctl, true);
}

protected virtual void DisableFormFields(Control ctl)
{
  EnableFormFields(ctl, false);
}

protected virtual void EnableFormFields(Control ctl, bool enable)
{
  EnableFormFields(ctl, enable, new string[0]);
}

protected virtual void EnableFormFields(Control ctl, bool enable, params string[] excludeControlName)
{
  bool exclude = false;
  foreach (string excludeCtl in excludeControlName)
  {
    if (string.Compare(ctl.Name, excludeCtl, true) == 0)
    {
      exclude = true;
      break;
    }
  }

  if (!exclude)
  {
    ctl.Enabled = enable;
    foreach (Control childCtl in ctl.Controls)
    {
      EnableFormFields(childCtl, enable, excludeControlName);
    }
  }
}

#endregion  Form Fields Enablers

Затем в конкретной форме я вызываю this.EnableFormFields(someContainerControl), когда хочу установить все элементы управления в данном контейнере, например все элементы управления на всех вкладках (tabcontrol) или все элементы управления на одной вкладке (tabpage), или даже все элементы управления в форме (передавая "this") и т. д. Я могу даже исключить некоторые элементы управления, передав их имена в виде массива строк, или каждое такое имя в качестве отдельного конечного параметра ("params" в списке параметров определения метода) ).

Я думаю, это то, что искал Джон. Важным примечанием для новичка является рекурсивность этого кода, установка свойства Enable для данного элемента управления, а затем вызов метода для установки свойства Enable в каждом из дочерних элементов управления. Каждый из них, в свою очередь, устанавливает свойство своих дочерних элементов управления.

Спасибо, John

0 голосов
/ 03 октября 2010

Это зависит от ситуаций, когда вы хотите переключить видимость и включить / отключить статус.
Если вы хотите изменить состояние, вы можете сделать что-то вроде:

private void ToggleVisible(TextBox tb)
{
  tb.Visible = !tb.Visible;
}
private void ToggleEnable(TextBox tb)
{
  tb.Enabled= !tb.Enabled;
}  

Также, если вы хотитечтобы обновить состояние нескольких текстовых полей одновременно, вам лучше определить метод и выполнить пакетное обновление для определенных групп.
Что действительно важно, так это правильно классифицировать (группировать) ваши текстовые поля.(в панели, если можете)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...