2011-10-19 7 views
1

この質問は、ASP.NETの達人向けです。それは私のナットを運転します。ASP.NETのコードビハインドでユーザーコントロールにアクセスする

私はASP.NET Webフォームアプリケーションを継承しました。このアプリケーションでは、複雑なネストされたユーザーコントロールの構造 を使用しています。複雑ではあるが、この場合には必要と思われる。 それにもかかわらず、私は単一のUserControlを使用するページを持っています。私たちは、このUserControlをルート制御と呼ぶでしょう。 次のようにこのユーザーコントロールが定義されています

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="widget.ascx.cs" Inherits="resources_userControls_widget" %> 
<div> 
    <asp:Panel ID="bodyPanel" runat="server" /> 
</div> 

widget.ascx.cs私のアプリケーションで

public partial class resources_userControls_widget : System.Web.UI.UserControl 
{ 
    private string source = string.Empty; 
    public string Source 
    { 
     get { return source; } 
     set { source = value; } 
    } 

    private string parameter1 = string.Empty; 
    public string Parameter1 
    { 
     get { return parameter1; } 
     set { parameter1 = value; } 
    } 

    private DataTable records = new DataTable(); 
    public DataTable Records 
    { 
     get { return records; } 
     set { records = value; } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 
     UserControl userControl = LoadControl(source) as UserControl; 
     if (parameter1.Length > 0) 
      userControl.Attributes.Add("parameter1", parameter1); 
     bodyPanel.Controls.Add(userControl); 
    } 

    private void InsertUserControl(string filename) 
    { 
    } 
} 

は、私は次のようにwidget.ascx使用していますwidget.ascx way: page.aspx

<uc:Widget ID="myWidget" runat="server" Source="/userControls/widgets/info.ascx" /> 

page.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable table = GetData(); 
    myWidget.Records = table; 
} 

info.ascxが、我々はこのような場合にはロードしたいユーザーコントロールとして設定されている様子がわかります。この場合、このアプローチが必要です。私は問題に集中することを正当化する無関係なコードを削除しました。かかわらず、info.ascx.csに私は次があります。

info.ascx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Here's the problem 
    // this.Parent.Parent is a widget.ascx instance. 
    // However, I cannot access the Widget class. I want to be able to do this 
    // Widget widget = (Widget)(this.Parent.Parent); 
    // DataTable table = widget.Records; 
} 

私は本当に親ユーザーコントロールから「レコード」プロパティの値を取得する必要があります。残念ながら、コードビハインドからWidgetクラスにアクセスできないようです。私が気づいていないコンパイル時に、UserControlの可視性に関するいくつかのルールがありますか? info.ascx.csのコードビハインドからWidgetクラスにアクセスするにはどうすればよいですか?

ありがとうございました!

+0

なるように興味があるだけ、何んthis.Parent.Parent.ToString()レポート? – Sabre

+0

Parent.ToString()は、取得しようとしているクラスの名前(ウィジェット)を示しています。それは、このすべてについて非常に奇妙なことです。実行時に、私はクラス名がちょうど良いことがわかります。ただし、dev /コンパイル時には、IntelliSenseではウィジェットを使用できません。私がIntelliSenseを無視してコンパイルに失敗しただけです。 –

答えて

3

まず、インターフェイスを作成してウィジェットユーザーコントロールクラスに実装する必要があります。例えば

public interface IRecord 
{ 
    DataTable Records {get;set;} 
} 

public partial class resources_userControls_widget : System.Web.UI.UserControl, IRecord 
{ 
... 
} 

そしてInfo.ascx.csの背後にあるコードでは、

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Here's the problem 
    // this.Parent.Parent is a widget.ascx instance. 
    // However, I cannot access the Widget class. I want to be able to do this 
    // Widget widget = (Widget)(this.Parent.Parent); 
    // DataTable table = widget.Records; 

    IRecord record=this.Parent.Parent; 
    DataTable table = widget.Records; 
} 
+0

非常に滑らかです。私はそれにショットをつけて、それがうまくいくならば、私はこの投稿に信用します。しかし、私はこの考えが好きです。 –

+0

申し訳ありませんが、IRecordレコード= this.Parent.Parent;親はコントロールタイプを持ち、カスタムインターフェイスを実装することができないため、馬鹿げています。 – apros

+0

それは私のために働いた。 –

0

あなたの場合は、ViewStateやSessionのようなサーバーオブジェクトを使用する方がよいかもしれません。あなたのページのDataTable内に埋め込み、info.ascxユーザコントロールのPage_loadイベントハンドラで取得します。

関連する問題