web-dev-qa-db-ja.com

c#-dividでFindControlを使用するとエラーが発生する

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に設定されているため、何も起こりません。皮肉なことに、[ローカル]ウィンドウを見てこれを調べると、リストにボタン番号IDが表示されているので、そこにあることがわかりますが、システムはコントロールを見つけられないように動作しています。

私の最終的な目標は、ボタンdivの最大ID番号を見つけることです(私のhtmlの例を見ると、最大IDは3(button3)になります)。 max id、各divに触れて、いくつかのcssプロパティを変更できるようにしたい。

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

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

[〜#〜] update [〜#〜]新しい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
}
8
JasonH

ページが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;
}

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

11
Kristof Claes

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

javascriptとcode-behindの両方から<div>にアクセス

0
Ashwin Chandran

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

0
Tianzhen Lin

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

これはうまくいくでしょう

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

しかし、これはしません

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

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

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

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

0
monsieurgutix