【问题标题】:find control at runtime在运行时找到控制
【发布时间】:2012-02-14 11:21:08
【问题描述】:
    protected void Button1_Click(object sender, EventArgs e)
    {
        FileUpload F = new FileUpload { ID = "FF" };
        PlaceHolder1.Controls.Add(F);

    }

     protected void Button2_Click(object sender, EventArgs e)
    {
        FileUpload FU = (FileUpload)PlaceHolder1.FindControl("FF");
        Label1.Text = Fu.filename;
      }

所以我在运行时找不到文件上传

【问题讨论】:

  • 但我想在运行时创建它

标签: asp.net


【解决方案1】:

您必须在每个回发时重新创建动态创建的控件。 因此,将已经创建的控件的数量存储在 ViewState 或 Session 中,并在 Page_Init 或 Page_Load(最迟)期间重新创建它们。分配与以前相同的 ID,以便正确触发事件并从 ViewState 重新加载值。

例如:

private Int32 ControlCount {
    get {
        if (ViewState("ControlCount") == null) {
            ViewState("ControlCount") = 0;
        }
        return (Int32)ViewState("ControlCount");
    }
    set { ViewState("ControlCount") = value; }
}

private void Page_Load(object sender, System.EventArgs e)
{
    if (ControlCount != 0) {
        RecreateControls();
    }
}

private void RecreateControls()
{
    addControls(ControlCount);
}

private void addControls(Int32 count)
{
    for (Int32 i = 1; i <= count; i++) {
        FileUpload F = new FileUpload { ID = "FF_" + i };
        PlaceHolder1.Controls.Add(F);
    }
}


Protected void Button1_Click(object sender, System.EventArgs e)
{
    addControls(1);
    ControlCount ++;
}

protected void Button2_Click(object sender, EventArgs e)
{
    if( ControlCount != 0 ){
        // find for example the first FileUpload control
        var index = 1;
        FileUpload FF1 = (FileUpload)PlaceHolder1.FindControl("FF_" + index);
        Label1.Text = FF1.filename;
    }
 }

【讨论】:

  • 如何在运行时在文本框上创建验证器,在运行时创建文本框,在运行时创建验证器
  • 我建议将所有内容都包含在UserControls 中,这样您就无需为单个控件而烦恼。但除此之外,它的工作原理与我的回答中描述的相同。您可以动态创建任意类型的控件,数量不限。
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 2022-06-30
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多