この質問は、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クラスにアクセスするにはどうすればよいですか?
ありがとうございました!
なるように興味があるだけ、何んthis.Parent.Parent.ToString()レポート? – Sabre
Parent.ToString()は、取得しようとしているクラスの名前(ウィジェット)を示しています。それは、このすべてについて非常に奇妙なことです。実行時に、私はクラス名がちょうど良いことがわかります。ただし、dev /コンパイル時には、IntelliSenseではウィジェットを使用できません。私がIntelliSenseを無視してコンパイルに失敗しただけです。 –