C# ASP.NET:通过编程方式添加html控件后在服务器端查找它们

C# ASP.NET:通过编程方式添加html控件后在服务器端查找它们,c#,asp.net,C#,Asp.net,我想做点什么,却遇到了问题 我得到了一个添加html元素和三个属性的函数。 现在,我想得到服务器端的控件(代码隐藏),这样我就可以用它们做一些事情了 我的问题是: 我找不到他们 这是我用来添加它们的函数的一部分,它有点长,所以我只显示我想在服务器端获得的控件: public string EditPhoto(int x) { using (StringWriter stringWriter = new StringWriter()) { using (HtmlT

我想做点什么,却遇到了问题

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

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

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

 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();
    }
公共字符串编辑照片(int x)
{
使用(StringWriter StringWriter=new StringWriter())
{
使用(HtmlTextWriter编写器=新的HtmlTextWriter(stringWriter))
{
//属性的一些字符串。
字符串classValue=“thumb”;

//Begin#5您完全可以按字面意思添加控件,但必须将它们添加到页面上已经存在的面板中。如果您尝试在运行时直接将控件添加到页面,则会出现错误

至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信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);
        }
    }
}
我在一个页面上搜索所有webchart控件,并将它们添加到一个数组中供以后使用,但您也可以通过ID轻松搜索,当您找到它时,只需返回; 请注意,按ID搜索时,您可能无法执行“control.ID==”某些字符串
在测试ID匹配之前,您可能必须将其强制转换为所需的数据类型

您完全可以按字面意思添加控件,但必须将它们添加到页面上已存在的面板之类的内容中。如果您尝试在运行时直接将控件添加到页面,则会出现错误

至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信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);
        }
    }
}
我在一个页面上搜索所有webchart控件,并将它们添加到一个数组中供以后使用,但您也可以通过ID轻松搜索,当您找到它时,只需返回; 请注意,按ID搜索时,您可能无法执行“control.ID==”某些字符串
在测试ID匹配之前,您可能必须将其转换为所需的数据类型

本系列博客可能会有所帮助。
本系列博客可能会有所帮助。 检查一下,伙计

您的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;
    }
检查一下,伙计

您的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;
    }

还可以使用的占位符控件添加和查找所需的所有控件

添加控件:

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;

还可以使用的占位符控件添加和查找所需的所有控件

添加控件:

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;

你不能按字面意思添加服务器控件。它们不会成为页面控件集合的一部分。你是否被锁定在使用HtmlTextWriter添加控件?当然有更简单和可扩展的方法来实现这一点,这将使在控件树中查找它们变得更容易。哦,我不知道。你在建议什么o do?@KodeKreachor你能给我一些例子来更好地添加和查找控件吗?我很想学习新东西!:)当然,请在下面查看我的答案。你不能按字面意思添加服务器控件。它们不会成为页面控件集合的一部分。你是否被锁定使用HtmlTextWriter添加控件?当然有这是一种更简单、可扩展的方法,可以使在控件树中查找控件变得更容易。哦,我不知道。你建议怎么做?@KodeKreachor你能给我一些例子,让我更好地添加和查找控件吗?我很想学习新东西!:)当然,请查看下面的答案,这对sam有帮助y、 因此,您应该将if((htmltexwriter)c.ID==“Title”+x)替换为if(c是WebChartControl)我尝试将WebChartControl更改为HtmlTextWriter,但我无法获取id属性,只能获取HtmlTextWriter类的to函数。我不知道哪个类代表使用HtmlTextWriter添加的控件。啊,HtmlTextWriter不是控件,它是一种创建html元素而不显式创建html控件的方法。您可以创建一个html输入控件,你可以给它一个ID并添加到一个面板中,就像@KodKreachor向你展示的那样。我不确定你是否在使用HtmlTextWriter,使用aspx文本框等更容易。如果你真的必须使用纯html,请创建一个HtmlInputControl并将其添加到你页面上已经存在的面板中。希望这能帮助samy,so-ins除了if(c是WebChartControl),您应该放置if((htmltexwriter)c.ID==“Title”+x)我尝试将WebChartControl更改为HtmlTextWriter,但我无法获取id属性,只能获取HtmlTextWriter类的to函数。我不知道哪个类代表使用HtmlTextWriter添加的控件。啊,HtmlTextWriter不是控件,它是一种创建html元素而不显式创建html控件的方法。您可以创建一个html输入控件,你可以给它一个ID并将其添加到面板中,就像@KodKreachor向你展示的那样。我不确定你是否在使用HtmlTextWriter,使用aspx文本框等更容易做到这一点。如果你真的必须使用纯html,请创建一个HtmlInputControl并将其添加到你页面上已有的面板中