如何将控制权传递给一个方法

5
我希望创建一个可以更改“enabled”属性的方法。我该如何将控件名称和属性传递给该方法?
如果以下是我的原始方法:
public void ChangeProperties()
{ 
     btnAcesScore.Enabled = true;
}

我希望能够每次调用此方法时更改“btnAcesScore”。我该如何将其传递给该方法?我尝试将其作为字符串传递,但那样行不通。
以下是我尝试过的内容:
public void ChangeProperties(string category)
{ 
     category = true;
}

ChangeProperties("btnAcesScore.Enabled");

苏珊


你为什么要这样做?这真的违反了面向对象设计原则。 - Daniel A. White
也许控制是以字符串形式从配置文件、XML或数据库中获取的? - Robert Kozak
8个回答

13

试试这个:

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

然后像这样调用它:

ChangeProperties(btnAcesScore);

同意..这更符合面向对象编程的思想,也更直接地回答了问题。 - madcolor
我错了吗?她难道不是在要求这个吗?还是她在要求更改控件的属性? - Canavar
你为什么要编写一个将控件设置为启用的方法,而不是直接将其设置为启用状态,避免在各处传递。如果只是为了面向对象编程,那也没错,但我从来没有因为某个东西没有问题就签署通过 :-) - Mark Dickinson
首先,不要认为它只是启用/禁用控件,我使用这种方法来设置许多属性到许多种类型的控件。有一次我因为一个非常简单的问题得到了很多赞成票和一个踩票,所以不要在意踩票,只要你知道这是真的就好了。 - Canavar

4

这个方法的目的是什么?是为了重复使用该方法来任意更改给定控件的Enabled属性吗?如果是这样,有一种更容易实现的方法,如Canavar所述。

或者这个方法的目的是切换设置吗?在这种情况下,您的方法将如下所示:

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

或者

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

取决于您是想操作一个控件还是多个控件。无论如何,我个人认为将单个属性访问封装在方法中没有太大意义,如果您坚持要这样做(且该方法未调整其他属性),我至少会将其重命名为ToggleEnabled之类的名称。


谁知道为什么人们在不说原因的情况下投反对票。我本来会改变答案的。哦,好吧,感谢你的评论。 - Mark Dickinson

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
  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

还可以怎么样?

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);

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
我会使用反射 - 在您发送到方法的对象上使用GetType()方法,然后使用GetProperties来匹配您发送的属性。然后您可以在那个点上设置值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接