8

C# コード ビハインド ファイルから ID で div 要素にアクセスしようとしている ASP.NET サイトがあります。基本的に、div 要素が存在するかどうかを確認し、存在する場合はそのプロパティを変更します。

さまざまな解決策を示す多くのリソースを見つけましたが、どれも機能していないようです。

ASP.Net ページの HTML:

<div class="contentArea">
     <div class="block" id="button1" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button2" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button3" runat="server">
            Some Content Here
     </div>
</div>

C# コード ビハインド (私が試した例):

System.Web.UI.HtmlControls.HtmlGenericControl div1 = (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("button1");
div1.Attributes["class"] = "classNameHere";

また

Control div1 = this.FindControl("button1");
div1.GetType();

コードが上記の各例の 2 行目に到達すると、エラーが発生します。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

次のことを試してみると:

if (div1 != null)
{
    // Do Something;
}

div1 は常に null に設定されているため、何も起こりません。皮肉なことに、[Locals] ウィンドウを見てこれを調べると、リストに button# ID が表示されているので、それらが存在することはわかっていますが、システムはコントロールが見つからないように動作しています。

私の最終的な目標は、ボタン div の最大 ID 番号を見つけることです (私の HTML の例を見ると、最大 ID は 3 (button3) になります。もっと良い方法があるかもしれませんが、いずれにしても、最大ID、各divに触れていくつかのcssプロパティを変更できるようにしたい.

これらはすべて jQuery を使用して簡単に実行できますが、この例では C# で実行する必要があります。

どんな助けでも大歓迎です。さらに情報が必要な場合は、お知らせください。

更新 新しい C# Web プロジェクトをゼロから作成しました。マスターページを追加し (変更せずに)、マスターページを使用して Web フォームを追加した後、コンテンツ ID="Content2" の下の Web フォームに 1 行だけ追加しました。

<div id="button1"></div>

C# コード ビハインドから、以前とまったく同じ問題が発生します。

最終更新と回答 上記の更新で誰も (私自身を含め) 私の間違いに気付かなかったことにショックを受けました。div の下にゼロから新しいプロジェクトを作成したときに、runat="server" を入れたことはありません。新しいプロジェクトで問題を最初から修正した方法は次のとおりです。

runat="server" を div に追加します。

<div id="button1" runat="server"></div>

次に、MasterPage の下の ContentPlaceHolder で FindControl を実行しました。

ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");

注: デフォルトで作成された Site.Master ページの ContentPlaceHolder コードは次のようになります。

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>

コード ビハインドでこの ContentPlaceHolder を見つけた後、このプレースホルダー内で button1 を検索しました。

using System.Web.UI.HtmlControls;
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");

最後に、myControl が null かどうかを確認します。

if (myControl != null)
{
    \\ Do Something
}

このコードを実行すると、探していた div が見つかりました。すべてをまとめた完全なコードは次のとおりです。

using System.Web.UI.HtmlControls;

ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");

if (myControl != null)
{
    // Do Something
}
4

4 に答える 4

11

ページで MasterPage を使用している場合、div コントロールはコントロールのメイン コレクションには含まれません。そのコレクションには、MasterPage の ContentPlaceholder を指すコンテンツ コントロールのみが含まれます。

次の 3 つのオプションがあります。

  1. FindControlコンテンツ コントロールで使用します。contentControl.FindControl("button1");
  2. FindControl必要なコントロールが見つかるまで再帰を実行します
  3. 通常、div コントロールの宣言は designer.cs 分離コードに追加されるため、その名前でコントロールに直接アクセスできます。button1.Attributes["class"] = "classNameHere";

アップデート

MasterPage を作成し、それにコンテンツ ページを追加<div id="button1" runat="server">Some text</div>し、コンテンツ ページに追加しました。

コンテンツ ページの分離コードに、次のコードを追加しました。

protected void Page_Load(object sender, EventArgs e)
{
    var control = FindHtmlControlByIdInControl(this, "button1");

    if (control != null)
    {
        control.Attributes["class"] = "someCssClass";
    }
}

private HtmlControl FindHtmlControlByIdInControl(Control control, string id)
{
    foreach (Control childControl in control.Controls)
    {
        if (childControl.ID != null && childControl.ID.Equals(id, StringComparison.OrdinalIgnoreCase) && childControl is HtmlControl)
        {
            return (HtmlControl)childControl;
        }

        if (childControl.HasControls())
        {
            HtmlControl result = FindHtmlControlByIdInControl(childControl, id);
            if (result != null) return result;
        }
    }

    return null;
}

これは私にとってはうまくいきます。

于 2012-07-10T16:23:02.320 に答える
0

問題を再現できないようですが、DIV が UpdatePanel、Repeater、Grid などのテンプレート コントロール内にある可能性はありますか?

于 2012-07-10T15:44:39.547 に答える
0

追加する場合 runat=serverは、div の最後に追加してください:

これはうまくいきます

<div id="divBtn" class="mybuttonCass" runat="server">

ただし、これは

<div runat="server" id="divBtn" class="mybuttonCass">

そうすることで、コードビハインドから任意のプロパティを次のように変更できます。

divBtn.Style["display"] = "none";

これはマスターページでも機能します。div はマスターページに含まれません。

于 2018-01-23T22:05:39.180 に答える
0

コード ビハインドでアクセスするすべてのコントロールに runat=server 属性を追加する必要があります。詳細については、この記事を参照してください。

JavaScript と分離コードの両方から <div> にアクセスする

于 2012-07-10T15:44:01.413 に答える