【问题标题】:Generic function to create controls at runtime在运行时创建控件的通用函数
【发布时间】:2010-11-29 23:03:44
【问题描述】:

我想在运行时使用 C# 向我的 aspx Web 表单添加控件。
我想编写一个通用函数来创建任何类型的控件(例如:文本框、标签、按钮等)。

请有任何想法。 谢谢 BB

【问题讨论】:

  • 您的意思是在浏览器(客户端)中的“运行时”或服务器上动态的“运行时”,所以客户端只会在页面刷新和回发时看到更新?跨度>

标签: c# dynamic controls generics


【解决方案1】:

你可以这样做,只要你想使用的控件类型都有一个默认的构造函数。

T AddControl<T>() where T : WebControl, new()
{
    T ctrl = new T();
    ...
    return ctrl;
}

【讨论】:

  • 大卫,谢谢。我想检查传入的控件是否是文本框并设置一些属性。下面我粘贴了我写的代码,但这不是正确的。我哪里错了。 if(ctrl.Equals(System.Web.UI.WebControls.TextBox)) {... 设置一些属性 }
  • 找到了答案。 if(ctrl is TextBox) {... 设置一些属性 }
  • 如果传入的控件是标签,我想设置标签的文本,我该怎么做?
  • if (ctrl is Label) {((Label)ctrl).Text = "FirstName :";} 我收到错误:“无法将类型 'T' 转换为 'System.Web.UI。 Webcontrols.Lable'"
【解决方案2】:

我想你可以这样做:

public void CreateControl<W>(Func<W> controlConstructor) where W : WebControl
{
         W control = controlConstructor();

         //add control and configure it, etc etc
}

【讨论】:

  • 对于那些具有简单构造函数的控件,也可能是一个简单的CreateControl&lt;T&gt;() where T : WebControl, new()。此外,您可能会传入一个代表图形中父对象的Control 实例,您可以在其中将新创建的控件添加到其Controls 集合中?
【解决方案3】:

将文本框控件添加到占位符

private void CreateTextBoxes()  
{

      for (int counter = 0; counter <= NumberOfControls; counter++)
      {
          TextBox tb = new TextBox();
          tb.Width = 150;
          tb.Height = 18;
          tb.TextMode = TextBoxMode.SingleLine;
          tb.ID = "TextBoxID" + (counter + 1).ToString();
          // add some dummy data to textboxes
          tb.Text = "Enter Title " + counter;
          phTextBoxes.Controls.Add(tb);
          phTextBoxes.Controls.Add(new LiteralControl("<br/>"));

      }

  }

在 CreateTextBoxes 方法中,我循环遍历我们想要在 phTextBoxes 占位符中动态创建的“n”个控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多