2009-02-25 27 views
0

私は正常に動作しているUserControlがあります。このように宣言されています。ASP.NET UserControl継承

public partial class DynamicList : System.Web.UI.UserControl 
{ 
     protected static BaseListController m_GenericListController = null; 

     public DynamicList() 
     { 
      m_GenericListController = new GenericListController(this); 
     } 
} 

ここでいくつかのプロパティを変更できるように、このコントロールをオーバーライドします。私はこのようなクラスを作りました。

public partial class JobRunningList : DynamicList 
{ 
    public JobRunningList() 
    { 
     m_GenericListController = new JobListController(this); 
     (m_GenericListController as GenericListController).ModuleId = 14; 
    } 
} 

私が今、予想通り、悪い結果を引き起こしJobRunningListコントロールを使用する場合、動的リストでのコントロールが作成さものの取得されていないことが表示されます。 DynamicList UserControlには、ListViewと他のいくつかのコントロールがあります。 JobRunningListの使用時には作成されていないようです。これに秘密はありますか?

+0

私はこの限られた量の情報で良い答えを得るつもりはないと思います。あなたがオーバーライドしようとしているすべてのコードを追加するようあなたの質問を編集することをお勧めします。おそらくすべてのクラスのコードも同様に... – Will

+0

これはかなり複雑です。 – Craig

+0

簡単な答えは、DynamicListを継承することはコードビハインドを継承することだけです。 。ascx自体は別のクラスにコンパイルされます(DynamicList自体を継承します)。その周りには方法がありますが、ウィル氏の言うとおり、実際にオーバーライドする必要があることについてもっと知る必要があります。 – stevemegson

答えて

0

退屈な回避策は、DynamicListを含むプレーンな古いユーザーコントロールとしてJobRunningListを作成し、そのOnLoadに内部コントロールのプロパティを設定することです。 DynamicListには、ページからアクセスしたい他の多くのプロパティがありますが、JobRunningListはそれ自体の一致するプロパティを定義する必要があるため、大変です。継承アプローチに戻って...

DynamicListクラスにはコードビハインドロジックが含まれているだけなので、2番目のコントロールが最初のロジックを再利用して新しいそれ自身のUI。

.ascxファイルのマークアップがDynamicListを継承する別のクラスにコンパイルされるため、DynamicListではなくそのクラスを継承するようにJobRunningListクラスを取得できる場合は、必要な結果が得られます。このクラスは、ファイル名から派生したデフォルトの名前を取得しますが、コントロール名にClassNameを設定して、自動名の代わりに使用するようにすることはできません。

ありきたりのコードビハインド

public partial class HelloControlBase : System.Web.UI.UserControl 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 
} 

などで

<%@ Control Language="C#" AutoEventWireup="true" 
      CodeFile="HelloControl.ascx.cs" Inherits="HelloControlBase" 
      ClassName="MyControls.HelloControl" %> 

Hello <%= Name %> 

のような単純な基本制御を取る今、私たちは、新しいコントロールのNameプロパティをオーバーライドします。最初にHelloAlice.ascxが必要です

<%@ Control Language="C#" AutoEventWireup="true" 
      CodeFile="HelloAliceControl.ascx.cs" 
      Inherits="HelloAliceControl" %> 

すべての作業を元のascxに任せているので、ここではあまり見ないでください。今、コードビハインドで、

public partial class HelloAliceControl : MyControls.HelloControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.Name = "Alice"; 
    } 
} 

私達はちょうどMyControls.HelloControlを継承し、Nameプロパティを設定し、我々が行っているように見えます。

問題は、MyControls.HelloControlが表示されていることを知ることです。派生したコントロールが親コントロールと同じディレクトリにある限り、おそらくOKです。そうでなければ、親コントロールがまだコンパイルされていないため、クラスが存在しないと不平を言ってビルドエラーが発生します。

0

私が正しく理解していれば、インターフェイスを同じにしたいと思う。その場合は、代わりにいくつかのプロパティを作成します。たぶん単純な列挙型、つまりListTypeでしょう。