2009-04-28 7 views
2

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

Если был следующий мой оригинальный метод:

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

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

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

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

ChangeProperties("btnAcesScore.Enabled"); 

Susan

+0

Почему вы пытаетесь это сделать? Это действительно нарушает методы проектирования ООП. –

+0

Может быть, элемент управления исходит из файла конфигурации, xml или базы данных в виде строки? –

ответ

9

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

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

и назвать его так:

ChangeProperties(btnAcesScore); 
+0

Мне нравится ваше лучше! – n8wrl

+0

согласился .. это больше ООП и отвечает на вопрос более непосредственно. – madcolor

+0

Я не прав? разве она не просит об этом? или она просит изменить свойство контроля? – Canavar

0

Как о также

void ChangeProperty(ref bool output) 
{ 
    output = true; 
} 
ChangeProperty(ref btnAcesScore.Enabled); 
0

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

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

затем вызвать его:

ChangeProperties(b => btnAcesScore.Enabled = b); 
4

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

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

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

или

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

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

+0

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

0

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

1

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

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

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

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

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
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; 
    } 
Смежные вопросы