Как передать управление методу - PullRequest
3 голосов
/ 29 апреля 2009

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

Если бы мой метод был следующим:

public void ChangeProperties()
{ 
     btnAcesScore.Enabled = true;
}

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

Вот что я попробовал:

public void ChangeProperties(string category)
{ 
     category = true;
}

ChangeProperties("btnAcesScore.Enabled");

Susan

Ответы [ 8 ]

10 голосов
/ 29 апреля 2009

Попробуйте это:

public void ChangeProperties(Control ctrl)
{ 
     ctrl.Enabled = true;
}

и назовите это так:

ChangeProperties(btnAcesScore);
4 голосов
/ 29 апреля 2009

Какова цель этого? Следует ли повторно использовать метод для произвольного изменения свойства Enabled любого данного элемента управления? Если это так, есть более простой способ сделать это, как указано в Canavar .

Или смысл этого метода в переключении настройки? В этом случае ваш метод будет выглядеть так:

public void ChangeProperties()
{ 
     btnAcesScore.Enabled = !btnAcesScore.Enabled;
}

или

public void ChangeProperties(Control ctrl)
{ 
     ctrl.Enabled = !ctrl.Enabled;
}

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

1 голос
/ 29 апреля 2009

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

форма имеет коллекцию элементов управления, и вы можете найти ее и использовать отражение для установки свойства:

public void ChangeProperties(Form form, string category)
{
   string[] parts = category.Split(".");
   int index = form.Controls.IndexOfKey(parts[0]);

   Control control = null;
   if (index >= 0)
   {
     control = form.Controls[index].;
   }

   if (control != null)
   {
     PropertyInfo propertyInfo = control.GetType().GetProperty(parts[1]);
     if (propertyInfo != null)
     {
       propertyInfo.SetValue(control, true);
     }
   }
}

если вы вызываете его из формы, в которой находится элемент управления

ChangeProperties(this, "btnAcesScore.Enabled");
0 голосов
/ 27 мая 2015
  Main()
   {
    ChangeProperties(ref category,True);    //Where Category is the ID  of the Textbox control  i.e <asp:textbox ID="Category "></textbox>
    }

   public void ChangeProperties(ref TextBox category,bool val)
    { 
      category.Enabled = val;
     }
0 голосов
/ 29 апреля 2009

Попробуйте это:

    public void ChangeProperties(string category, object value)
    {      
        var categoryConcat = category.Split('.');
        var control = this.Controls.Cast<Control>()
            .Where(x => x.Name == categoryConcat[0]).First();
        control.GetType().GetProperty(categoryConcat[1])
            .SetValue(control, value);        
    }

В этом примере, вероятно, нужны некоторые проверки существования элемента управления и свойства.

0 голосов
/ 29 апреля 2009

Я бы использовал отражение - используйте метод GetType () для объекта, который вы отправляете в ваш метод, а затем используйте GetProperties для сопоставления со свойством, которое вы отправляете. Затем вы можете установить значения в этой точке.

0 голосов
/ 29 апреля 2009

Не уверен, что я полностью понимаю ваше намерение, но вы могли бы передать делегат некоторому коду, который изменил ваше свойство ...

public void ChangeProperties(Action<bool> setprop)
{
    ...
    setprop(true);
}

тогда назовите это:

ChangeProperties(b => btnAcesScore.Enabled = b);
0 голосов
/ 29 апреля 2009

Как насчет также

void ChangeProperty(ref bool output)
{
    output = true;
}
ChangeProperty(ref btnAcesScore.Enabled);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...