如何循环遍历控件以获取特定类型的控件?

4

I have a div like this:

<div id="columns" runat="server">
       <ul id="column1" class="column" >
        <!-- /////////////// -->
        </ul>
        <ul id="column2" class="column" runat="server">
        </ul>
        <ul id="column3" class="column" runat="server">
        </ul>
        <ul id="column4" class="column" runat="server">
            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        </ul>
    </div>

在运行时,我创建了一个 列表项(HtmlGenericControl outer_li = new HtmlGenericControl("li"); 在 (ul 具有属性 runat ="server").

现在我想做的是: 循环遍历 div id="columns" 来获取每个(ul 具有属性 runat ="server") 然后循环遍历每个(ul) 来获取每个列表项以保存内容。
foreach (Control c in columns.Controls.OfType<HtmlGenericControl>())
        {
            var ctrl = (HtmlGenericControl)c;

            if (ctrl.TagName == "ul" && ctrl.ID != "column1")
            {
                foreach (Control li in ctrl.Controls.OfType<HtmlGenericControl>())
                {

                    var ctrl_li = (HtmlGenericControl)li;
                    if (ctrl_li.TagName == "li")
                    {
                        string id = ctrl_li.ID;
                    }
                }
            }
        }

这不起作用,我无法获取页面上的“li”,尽管有li标签。


编辑2:

 protected void CreateBlockOfData(string widget_color, int column_par, string process_name, int block_type, int block_id)
        {
            HtmlGenericControl outer_li = new HtmlGenericControl("li");
            outer_li.Attributes.Add("class", widget_color);
            if (column_par == 1)
            {
                column1.Controls.Add(outer_li);
            }
            else if (column_par == 2)
            {
                //uppnl_2.ContentTemplateContainer.Controls.Add(outer_li);
                column2.Controls.Add(outer_li);
            }
            else if (column_par == 3)
            {
                column3.Controls.Add(outer_li);
            }
            else if (column_par == 4)
            {
                column4.Controls.Add(outer_li);
            }
            ////////////////////////////////////////////////////////////
            HtmlGenericControl div_head = new HtmlGenericControl("div");
            div_head.Attributes.Add("class", "widget-head");
            outer_li.Controls.Add(div_head);
            ////////////////////////////////////////////////////////////
            HtmlGenericControl h3 = new HtmlGenericControl("h3");
            div_head.Controls.Add(h3);
            ///////////////////////////////////////////////////////////
            Label lbl_process_name = new Label();
            lbl_process_name.Text = process_name.TrimEnd();
            h3.Controls.Add(lbl_process_name);
            ///////////////////////////////////////////////////////////
            HtmlGenericControl div_content = new HtmlGenericControl("div");
            div_content.Attributes.Add("class", "widget-content");
            outer_li.Controls.Add(div_content);
            ////////////////////////Data//////////////////////////////
            Control crl_data = FormTheData(block_type, block_id);
            PlaceHolder1.Controls.Add(crl_data);
            crl_data.DataBind();
            div_content.Controls.Add(crl_data);
        }

为什么不在这里使用 BulletedList 类? - MAW74656
3
如果您将这些<li>作为HTML文本添加到占位符中,那么在ASP.Net的视角下它们不是“控件”。您不能将“runat=server”作为纯属性添加以使其成为控件,您需要将它作为HtmGenericControl或类似的内容添加。 - Hans Kesting
请问您能否检查一下我的最后一次编辑? - Anyname Donotcare
2个回答

1

我测试了一下,并手动添加了一些<li>。如果我在它们的标签中设置runat="server",我可以让它们显示出来。因此,您用于生成和添加ListItems的代码没有使用runat创建它们。

编辑
您可能需要考虑使用实际的ASP .NET控件,例如DataGrid、Repeater或BulletedList,正如MAW74656建议的那样,而不是HTML的<ul>


我试图添加属性。outer_li.Attributes.Add("runat","server");但是没有成功。尽管它出现在视图源代码中,而且使用了runat="server" - Anyname Donotcare

0
也许你可以改变你的列表,使用ASP listitem控件,这将允许你...
试试这个。使用is来转换控件进行测试是高效的。
  foreach (Control c in Page.Controls)
    {
        if (c is ListItem)
        {
            //do something with the control
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接