5

と の 2 つのユーザー コントロールがUserControl1ありUserControl2ます。これらのコントロールは Page.aspx に追加されます。

UserControl1: このユーザー コントロールには、このユーザー コントロール内の非表示のテキスト ボックスのメソッドが含まれています。このメソッドは " HideTextbox"と呼ばれます

UserControl2HideTextBox: メソッド " " を から呼び出したいUserControl2

HideTextBoxからメソッドを呼び出すにはどうすればよいUserControl2ですか?

4

6 に答える 6

6

両方がユーザーコントロールまたはサーバーコントロールである場合、またはユーザーコントロールからサーバーコントロールを探している場合にのみ、これが機能します。(asp.usercontrol_xxアセンブリへの参照を取得できないため、サーバーコントロールからではありません)

最初に親ページへの参照を取得します (通常、これは で実行できますthis.Parent。次に、親で再帰的な FindControl を実行して、型が であるコントロールを見つけますUserControl2。コード例:

//this for extension method
public static UserControl2 FindUserControl2Recursive(this Control root)
{
    var uc2 = root as ASP.UserControls_UserControl2_ascx;
    if (uc2 != null)
    {
        return uc2;
    }
    foreach (var control in root.Controls)
    {
        uc2 = control.FindUserControl2Recursive();
        if (uc2 != null)
        {
            return uc2;
        }
    }
    return null;
}

Usercontrol2 参照を取得したら、パブリック メソッドを簡単に呼び出すことができます。

于 2013-01-17T19:57:06.933 に答える
6

この問題は、UC2 でカスタム イベントを作成し、メイン ページでそのイベントを使用して UC1 で hide メソッドを呼び出すことで解決できます。

ユーザーコントロールでデリゲートを宣言します

public delegate void HideTextBoxEventHandler(object sender, EventArgs e);

次に、作成したデリゲートのイベントを定義します

public event HideTextBoxEventHandler HideTextBox;

テキスト ボックスを非表示にするコード内のポイントで、そのイベントを呼び出す必要があります。

if (this.HideTextBox != null) // if there is no event handler then it will be null and invoking it will throw an error.
{
   EventArgs e = new EventArgs();
   this.HideTextBox(this, e);
}

次に、メイン ページからイベント処理メソッドを作成します。

protected void UserControl2_HideTextBox(Object sender, EventArgs e)
{
   UC1.InvokeHideTextBox();  // this is the code in UC1 that does the hiding
}

ページの読み込みに追加するか、UC2 を読み込んでいる場所に追加する必要があります。

UC2.HideTextBox += new UserControl2.HideTextBoxEventHandler(this.UserControl2_HideTextBox);
于 2013-01-17T20:29:02.303 に答える
1

テキストボックスを非表示にする方法を知っているコントロールのインターフェイスを次のように宣言します。

public interface ITextBoxHider
{
  void HideTextBoxes();
}

その後、このインターフェイスを UserControl1 に実装します。テキスト ボックスを非表示にする場合は、フォーム上のすべてのコントロールを列挙し、ITextBoxHider を実装するコントロールを見つけてから、そのメソッドを呼び出すだけです。

すべてのコントロールを列挙するヘルパー メソッド:

public static IEnumerable<Control> GetAllChildren(Control parent)
{
  foreach (Control control in parent.Controls)
  {
    foreach (Control grandChild in GetAllChildren(control))
        yield return grandChild;

    yield return control;
  }
}

そのメソッドを使用して、 UserControl2 から HideTextBoxes を呼び出します。

var hider = GetAllChildren(this.Page).FirstOrDefault(ct => ct is ITextBoxHider);
if (hider != null)
  (hider as ITextBoxHider).HideTextBoxes();
于 2013-01-17T21:04:00.880 に答える
-1

Usercontrol のオブジェクトを使用してメソッドにアクセスする場合は、このように登録する必要があります。

UserControl1 uc = new UserControl1();
uc.HideTextBox();

HideTextBox() をパブリックとして宣言する必要があります。

また、ユーザー コントロールを動的にロードすることを Web フォームに伝えるディレクティブを Web フォームに追加する必要があります。そのため、Web フォームに次のディレクティブを追加します。

<%@ Reference Control = "WebUserControl1.ascx" %>

お役に立てれば

于 2013-01-17T19:35:17.920 に答える
-1

まず、プライベートではなくメソッドを作成HideTextBox()する必要があります。public

次に、 を呼び出しますUserControl1.HideTextBox()

更新: UserControl1 への参照の取得について明確ではありませんでした。プロジェクトでこれを行ったとき、呼び出すメソッドを宣言するインターフェイスを作成したので、コードは次のようになりました。

IUserControl1 uc1 = (IUserControl1)this.Parent.FindControl("ucOne");
uc1.HideTextBox();

UserControl1 がインターフェイスから派生していることを確認してください: public partial class UserControl1 : System.Web.UI.UserControl, IUserControl1

于 2013-01-17T19:29:45.000 に答える