假设有100个按钮,命名为 Button1, Button2, Button3 ………… ,Button100。
这时我要给实现下面的操作 
Button1.Text = 1;
Button2.Text = 2;
Button3.Text = 3;
...
Button100.Text = 100;
这样感觉有点傻瓜,烦琐重复的事应该让计算机来完成才对,我想知道可不可以通过 for 循环来实现,问题是控件的名称用连接字符串的方法连接起来的吗?这样可以吗?
for (int i = 1; i <= 100, i++)
{
// 这里要添加的代码应该怎么写???
}

解决方案 »

  1.   

    用反射,参考以下代码
    public TextBox GetCtrl(string ctlName)
    {
      FieldInfo fi;
    string flag = ctlName;
    Type type = this.GetType();
    fi = type.GetField(flag);
    if( fi == null)
    return null;
    else
    return((TextBox)fi.GetValue(this));
    }
    注意button要设置成public
      

  2.   

    谢谢楼上的,问题已经解决,不过还是有点知其然而不知其所以然的感觉,,MSDN 上对于 Type.GetField 方法 是这样描述的:如果请求的类型是非公共类型,并且调用方不具有 ReflectionPermission 来反射当前程序集之外的非公共对象,则此方法返回空引用(Visual Basic 中为 Nothing)。
    有谁能解释一下为什么必须将控件设置为 public 吗?
      

  3.   

    是为了安全的考虑。
    你不妨看看ReflectionPermission 的资料。
      

  4.   

    在WinForm下测试通过, 但在WebForm下的控件也找不到 Modifiers 属性, 抛出"未将引用设置到对象实例"的异常
      

  5.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面

    Control c = null;
    for(int i=1; i<=100; i++)
    {
    c = this.FindControl("Button" + i.ToString());
    if (c != null)
    {
    if (c.GetType().FullName == "System.Web.UI.WebControls.Button")
    {
    ((Button)c).Text = i.ToString();
    }
    }
    }
    }