1

マスター ページとしてASP.NET Web フォーム ページchildPage.aspxがあります。masterPage.aspxchildPage.aspxは、ユーザー コントロール ( userControl.ascx) コントロールが定義されています。childPage.aspx現在、ユーザー コントロール内からコントロールにアクセスしようとしています。私はいくつかの異なるアプローチを試しました:

HtmlContainerControl ProductMenu = (HtmlContainerControl)Page.FindControl("ProductMenu");

HtmlContainerControl ProductMenu = (HtmlContainerControl)this.Page.FindControl("ProductMenu");

HtmlContainerControl ProductMenu = (HtmlContainerControl)Parent.FindControl("ProductMenu");

HtmlContainerControl ProductMenu = (HtmlContainerControl)this.Parent.parent.FindControl("ContaintHolder").FindControl("ProductMenu")

上記のコードでProductMenuは、id<div runat="server" />onのchildPage.aspxです。現在、ユーザー コントロール内からアクセスしようとしていますが、div.

私を助けてください。どうすればいいですか?前もって感謝します。

4

1 に答える 1

1

これが機能しない理由は、FindControl()メソッドが再帰的ではないためです。これは、MSDN ドキュメントで呼び出されます。

このメソッドは、コントロールが指定されたコンテナに直接含まれている場合にのみコントロールを検索します。つまり、このメソッドは、コントロール内のコントロールの階層全体を検索しません。

したがって、たとえば、コレクションPage.FindControls()にリストされているコントロールのみを検索します。これらの各コントロールのコレクションはPage.Controls検索されません。そのため、ASPX ページの最上位にある場合にのみ機能します。たとえば、コントロール内にネストされている場合、このコードは機能しません。ControlsPage.FindControl()ProductMenuPanel

これを解決するには、コントロール ツリーをクロールする再帰関数を作成する必要があります。例えば:

public Control FindControl(Control parentControl, string controlName) {
  foreach (var childControl in parentControl.Controls) {
    if (childControl.Id == controlName) return childControl;
    var foundControl = FindControl(childControl, controlName);
    if (foundControl != null) return childControl;
  }
  return null;
}

あなたの場合、常にan のインスタンスを探していると仮定するHtmlContainerControlと、型を検証して、強く型付けされたオブジェクトを返すことさえできます。つまり、異なる型をサポートしながら強く型付けしたい場合は、代わりにジェネリックを使用できます。

public T FindControl<T>(Control parentControl, string controlName) where T : Control {
  foreach (var childControl in parentControl.Controls) {
    if (childControl.Id == controlName) return childControl;
    var foundControl = FindControl<T>(childControl, controlName);
    if (foundControl != null && foundControl is T) return childControl;
  }
  return null;
}

さらに、これを繰り返し行う必要がある場合は、これを拡張メソッドとしてPageクラスに追加して、複数のページで簡単にアクセスできるようにすることができます。

于 2015-06-07T21:46:49.017 に答える