5

やあみんな。

私はこのような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内でdividt_e_0_aを見つける必要があります。

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

しかし、それは私にエラーを与えます...

4

2 に答える 2

3

コントロールではないので、思い通りにできません。属性を配置runat="server"するか、何らかの方法で取得できます。そこから、.net用のHTMLパーサー(たとえば、ここで提案されているHTMLAgilityPackshowdiv.InnerHtmlで解析できる文字列として表示される必要があります。

実行時にサーバー側のコントロールを作成するには、次のようなものを使用できます。

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

それらのコントロールを取得します。ただし、そのように追加されたコントロールは、リクエストごとに追加する必要があることに注意してください。

于 2012-12-24T06:18:37.570 に答える
0

どのように機能するかという再帰関数を試してみるべき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;
        }

    }
}

これで、上記の再帰関数を使用して、任意の深さの任意のコントロールを見つけることができます。

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

最後に、GetThisControlコントロールオブジェクトにId="myButton1"を持つコントロールを提供します。

于 2012-12-25T13:26:45.057 に答える