【问题标题】:Find div at run time at server side in c#在c#的服务器端运行时查找div
【发布时间】:2012-12-24 06:11:50
【问题描述】:

大家好。

我在 index.aspx 页面中有这样的 div

<div id="MainDiv" runat="server">

我正在从服务器端(在运行时)创建 div,例如

 for (Int32 i = 0; i < 4; i++)
    {

        //Create here divFinal
        HtmlGenericControl divFinal = new HtmlGenericControl("div");
        divFinal.ID = i.ToString();

        divFinal.Attributes.Add("class", "column");


        mainDiv.Controls.Add(divFinal);
        //add to maindiv


        HtmlGenericControl div = new HtmlGenericControl("div");
        div.ID = "t_e_" + i.ToString() + "_a";
        div.Style["background-color"] = "#CFD8E6";
        div.Attributes.Add("class", "grid");
        div.Attributes.Add("onclick", "OnMouseDownDiv(this)");

        div.Attributes.Add("onmouseover", "OnMouseDown(this)");
        div.Attributes.Add("onmouseout", "OnMouseUp(this)");
        divFinal.Controls.Add(div);

        // add to dvfinal


    }

生成评分后,它在 HTML 表单中的外观如下所示

 <div id="mainDiv"><div id="0" class="column"><div id="t_e_0_a"></div></div><div id="1" class="column"><div id="t_e_1_a"></div></div></div>

现在我需要在主 Divdiv 中找到 div id t_e_0_a。

HtmlGenericControl div = 
    ((HtmlGenericControl)showdiv.FindControl("0")); 

但它给了我错误....

【问题讨论】:

  • 通过 runat="server" 使其成为服务器控制。
  • 我已经编辑了我的问题。请参阅,感谢您的帮助。
  • html ID 不能以数字开头

标签: c# asp.net html


【解决方案1】:

你不能随心所欲,因为它不是一个控件。您应该在其上放置 runat="server" 属性,或者您可以从 showdiv.InnerHtml 以某种方式获取它 - 它应该以字符串的形式呈现,您可以使用 .net 的一些 HTML 解析器进行解析(例如,HTMLAgilityPack 建议使用 @987654322 @)

要在运行时创建服务器端控件,您可以使用以下内容:

for (Int32 i = 0; i < 2; i++)
{
        HtmlGenericControl div = new HtmlGenericControl("div");
        div.ID = i.ToString();
        div.InnerHtml = i.ToString();
        div.ClientIDMode = ClientIDMode.Static; //this is for .NET 4.5 only. Required to have ClientID the same as ID.
        showdiv.Controls.Add(div);
}

然后,在添加控件之后,您应该能够使用类似这样的东西:

HtmlGenericControl div=((HtmlGenericControl)showdiv.FindControl("1"))

获取这些控件。但请记住,必须为每个请求添加这样添加的控件。

【讨论】:

  • 我已经编辑了我的问题。请参阅,感谢您的帮助。
  • 感谢 FAngel,让我实现它。
  • 我收到错误无法获取 0 的内部内容,因为内容不是 litera
  • 而且...让我猜猜(你知道,我是心灵感应者,可以读懂人心),这发生在客户端。当您尝试获取像document.getElementById('1').innerText 这样的元素时,对吗?还是我很敏感?如果我是一名优秀的心灵感应者,那么您应该记住 runat="server" 控件在客户端的 ID 与您在服务器上的 ID 不同。见ClientID属性
  • 如果我的猜测是正确的,并且您正在使用 .net 4.5,您可以使用 ClientIDMode 属性来获取与 ID 相同的 ClientID。让我更新一个答案
【解决方案2】:

您应该尝试使用 Page.FindControl 工作原理的递归函数。

private Control getFollowingControl(Control c, string key,out Control returnControl)
{        
    if(c.hasChild)
    {
        foreach(Control item in c.controls)
        {
            getFollowingControl(item,key,out returnControl);
        }
    }
    else
    {
        if(c.Id==key)
        {
            returnControl=c;
            break;
        }

    }
}

现在你可以使用上面的 recusive 函数来找到任何深度的任何控件....

Control getThisControl=null;
getFllowingControl(this,"myButton1",out getThisControl);

最后,它会为您提供在 GetThisControl 控件对象中具有 Id="myButton1" 的控件。

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 2019-07-03
    • 2011-01-21
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多