如何将控制权传递给方法

时间:2009-04-28 20:43:02

标签: c# methods

我想创建一个更改enabled属性的方法。如何将contorl名称和属性传递给方法。

如果以下是我原来的方法:

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

我希望每次调用此方法时都能更改“btnAcesScore”。如何将此传递给方法。我尝试将其作为字符串传递,但这不起作用。

以下是我的尝试:

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

ChangeProperties("btnAcesScore.Enabled");

苏珊

8 个答案:

答案 0 :(得分:10)

试试这个:

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

并称之为:

ChangeProperties(btnAcesScore);

答案 1 :(得分:4)

这到底是什么意思?是否重用该方法来任意更改任何给定控件的Enabled属性?如果是这样,有一种更简单的方法来完成它,如Canavar所述。

或者这个方法的重点是切换设置?在这种情况下,您的方法看起来像:

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

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

取决于您是想只打一个控件,还是提供多个控件的访问权限。无论如何,我个人认为在方法中封装单个属性访问并没有太多意义,如果你坚持(并且这个方法没有调整其他属性),我至少会将它重命名为{ {1}}。

答案 2 :(得分: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");

答案 3 :(得分:0)

怎么样

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

答案 4 :(得分:0)

不确定我是否完全理解您的意图,但您可以将代理传递给某些更改了您的财产的代码......

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

然后调用它:

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

答案 5 :(得分:0)

我使用反射 - 对您发送到方法的对象使用GetType()方法,然后使用GetProperties匹配您发送的属性。然后,您可以在该点设置值。

答案 6 :(得分: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);        
    }

该示例可能需要对控件和属性的存在进行一些检查。

答案 7 :(得分: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;
     }