NET:通过程序添加html控件后,在服务器端查找它们

本文关键字:服务器端 查找 控件 过程 程序 html 添加 NET | 更新日期: 2023-09-27 18:28:48

我试图做一些事情,遇到了一个问题。

我得到了一个添加html元素和thire属性的函数。现在,我想在服务器端(代码背后)获得控件,这样我就可以用它们做一些事情。

我的问题是:我找不到他们。

这是我用来添加它们的功能的一部分,它有点长,所以我只显示我想在服务器端获得的控件:

 public string EditPhoto(int x)
{
    using (StringWriter stringWriter = new StringWriter())
    {
        using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
        {
            // Some strings for the attributes.
           string classValue = "thumb";
            //Begin #5 <div class=image-title">
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "image-title");
            writer.AddAttribute("runat", "server"); //--> server side att
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "title" + x);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            TextWriter innerTextWriter = writer.InnerWriter;
            innerTextWriter.Write(title);
            writer.RenderEndTag(); //#End 5 </div>

            //Begin #6 <div class="image-desc">
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "image-desc");
            writer.AddAttribute("runat", "server"); //--> server side att
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "desc" + x);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            innerTextWriter = writer.InnerWriter;
            innerTextWriter.Write(descreption);
            writer.RenderEndTag(); //#End 6 </div>
            writer.RenderEndTag();//#End 4 </div>
            writer.RenderEndTag(); // End #1 </li>
        }
        // Return the result.
        return stringWriter.ToString();
    }

功能完成后,我得到了这个测试代码来尝试寻找它们:

for (int i = 0; i < Controls.Count; i++)
    {
    if (FindControl("title" + i) != null)
        Response.Write("Found 1 title control");
    else
        Response.Write( i +"There is no control");
    }
        for (int i = 0; i < Controls.Count; i++)
        {
            if (FindControl("desc" + i) != null)
                Response.Write("Found 1 descreption control");
            else
                Response.Write(i + "Thre is no control");
        }

对不起我的英语

NET:通过程序添加html控件后,在服务器端查找它们

检查一下,伙计。。。。

你的aspx中会有某种容器,比如:

    <asp:Panel ID="controlPanel" runat="server"></asp:Panel>

然后在你身后的代码中,你可能会有这样的东西:

    protected void Page_Load(object sender, EventArgs e)
    {
        InsertControls();
    }
    private void InsertControls()
    {
        TextBox textBox = new TextBox();
        textBox.ID = "textBox1";
        textBox.Text = "Cool Beans";
        controlPanel.Controls.Add(textBox);
        TextBox locatedTextBox = TraverseControlTree(controlPanel, "textBox1") as TextBox;
    }
    public static Control TraverseControlTree(Control root, string Id)
    {
        if (root.ID == Id) { return root; }
        foreach (Control Ctl in root.Controls)
        {
            Control control = TraverseControlTree(Ctl, Id);
            if (control != null) { return control; }
        }
        return null;
    }

这个博客系列可能会有所帮助。了解动态控制

您绝对可以直接添加控件,但必须将它们添加到页面上已有的面板中。如果您试图在运行时直接将控件添加到页面中,则会出现错误。

至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信FindControl不会递归搜索,只在当前的命名容器中搜索。

我通过编写这样的代码解决了这个问题:

private void AddControls(ControlCollection page, ArrayList controlList)
{
    foreach (Control c in page)
    {
        if (c is WebChartControl)
        {
            WebChartControl chart = c as WebChartControl;
            controlList.Add(chart);
        }
        if (c.HasControls())
        {
            AddControls(c.Controls, controlList);
        }
    }
}

我在一个页面上搜索所有的网络图表控件,并将它们添加到一个数组中以供稍后使用,但你也可以很容易地按ID搜索,当你找到它时,只需返回;注意,当按ID搜索时,您可能无法执行"control.ID="some string"在测试ID匹配之前,您可能必须将其强制转换为所需的数据类型

您还可以使用的PlaceHolder控件来添加和查找所需的所有控件。

AddControl:

RadioButtonList wRadioButtonList = new RadioButtonList { ID= "myID" };
wRadioButtonList.Items.Add( new ListItem( "Yes", "yes" ) );
wRadioButtonList.Items.Add( new ListItem( "No", "no" ) );
m_plh_PlaceHolde.Controls.Add( wRadioButtonList );

FindControl:

 RadioButtonList wRbl = m_plh_PlaceHolde.FindControl("myID" ) as RadioButtonList;