【问题标题】:How to loop through controls to get specific type of controls?如何遍历控件以获取特定类型的控件?
【发布时间】:2012-03-10 23:08:09
【问题描述】:

我有一个这样的 div:

<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>

在运行时,我在 (ul 具有属性 runat ="server") 中创建 listitems(HtmlGenericControl outer_li = new HtmlGenericControl("li");)

现在我想做的是: 循环通过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类?
  • 如果您将那些&lt;li&gt; 作为html 文本添加到占位符,那么就ASP.Net 而言,它们不是“控件”。您不能将“runat=server”添加为普通属性以使其成为控件,您需要将其添加为 HtmGenericControl 或类似的东西。
  • 你能检查一下我最后的编辑吗?

标签: c# asp.net css linq controls


【解决方案1】:

我对此进行了测试并手动添加了一些&lt;li&gt;。如果我在他们的标签中设置runat="server",我可以让他们出现。因此,您用于生成和添加 ListItems 的代码不是使用 runat 创建它们。

编辑
您需要考虑使用实际的 ASP .NET 控件,例如 MAW74656 建议的 DataGrid、Repeater 或 BulletedList,而不是 HTML &lt;ul&gt;

【讨论】:

  • 嗯,我尝试添加属性。 outer_li.Attributes.Add("runat","server"); 但无效..虽然它出现在视图源中并带有runat="server"
【解决方案2】:

也许您可以更改您的列表以使用 ASP listitem 控件,这将允许您...

试试这样的。使用 is 来进行测试是有效的。

  foreach (Control c in Page.Controls)
    {
        if (c is ListItem)
        {
            //do something with the control
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2014-11-25
    相关资源
    最近更新 更多