4

カスタムベースページクラス(System.Web.UI.Pageクラスから継承)からすべて継承する多数の.aspxページ(asp.net 4、c#)があります。

慣例により、これらすべてのページには同じコントロールのセットがあります(たとえば、同じIDを持つ2つのテキストボックス)。

.Textページ上のこれらのコントロールから値 を取得するカスタムベースページクラスにいくつかのジェネリックコードを配置したいと思います。

これはMasterPageの設定ではないことに注意してください。カスタムベースページクラスがあり、次にそのベースページクラスから継承する一連のページがあります。

基本クラスからページ上のテキストボックスを参照するにはどうすればよいですか?

4

3 に答える 3

3

を使用してコントロールにアクセスできるはずですPage.FindControl("ControlID")

基本クラスから:

var txt = Page.FindControl("TextBox1") as TextBox;
if (txt != null)
{
    //found the textbox
    //...
}

コントロールが配置されているフォームの場所に応じて、特にインターフェイスを実装するコンテナーに配置されている場合は、コントロール階層をトラバースできるINamingContainer再帰メソッドを作成する必要がある場合があります。FindControl()

public Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
        return root;

    foreach (Control control in root.Controls)
    {
        Control foundControl = FindControlRecursive(control, id);
        if (foundControl != null)
            return foundControl;
    }

    return null;
}
于 2012-05-11T20:34:01.353 に答える
2

慣例により、すべてのコントロールに同じセットのコントロールがある場合は、コントロールを基本クラスに移動してみませんか?

または、共通のコントロールセットを含むインターフェイスを作成し、そのインターフェイスをすべてのaspx.csコードビハインドに実装することもできます。これにより、規則に反するいくつかのaspxページを作成できます。基本クラスで「this」をインターフェースとしてキャストし、nullでない場合は、コントロールを変更できます。例えば:

IControlSet controlSet = this as IControlSet;

if(controlSet != null)
{
    controlSet.Name.Text = "someName";
}
于 2012-05-11T20:20:59.460 に答える
2

できることの 1 つは、基本クラスに抽象メソッドまたはプロパティを配置することです。これにより、継承者がこのメソッドを実装することが強制され、ベースは確実にそれを呼び出すことができます。

protected abstract TextBox MyTextBox { get; }

継承されたすべてのページはこのメソッドを実装する必要があり、理想的には MyTextBox を返します。

上で定義したようにインターフェースを作成するか、そのコントロールのセットを持つページを表す他の Base から継承する別の PageBase を作成することができます。

編集:

実装例として。基本クラスが MyPageBase と呼ばれ、HomePage.aspx に ID="TextBox1" の Textbox があると仮定します。

ベースで抽象プロパティを定義します

public abstract class MyPageBase : Page
{
    protected abstract TextBox MyTextBox { get; }
}

ページ上:

public partial class HomePage : MyPageBase
{
    protected override TextBox MyTextBox
    {
        get 
        {
             return this.TextBox1;
        }
    }
}

抽象化されているため、ベース内でプロパティにアクセスできます。これはインターフェイスのように機能し、実装する必要があります。次に、継承者がコントラクトを尊重すると仮定して、ベースはこのプロパティにアクセスできます。

this.MyTextBox.Text = "Change the text";

テキストまたは別の特定のプロパティを変更するだけの場合は、それをより適切にカプセル化し、特定のテキスト ボックスのテキスト プロパティのみに getter/setter を提供する方が理想的です。このサンプルでは、​​テキスト ボックスの実際のインスタンスを変更することはできませんが、そのプロパティにアクセスして変更することはできます。

于 2012-05-11T20:23:21.623 に答える