这个问题适用于ASP.NET大师。它让我疯狂。
我继承了一个ASP.NET Web Forms应用程序。此应用程序使用复杂 嵌套用户控件的结构。虽然很复杂,但在这种情况下似乎是必要的。 无论如何,我有一个使用单个UserControl的页面。我们将调用此UserControl 根控制。此UserControl定义如下:
widget.ascx
<%@ 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: 的 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设置为我们要加载的UserControl。在这种情况下,这种方法是必要的。我删除了无关的代码,证明它可以专注于问题。无论如何,在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;
}
我真的需要从Parent用户控件获取“Records”属性的值。不幸的是,我似乎无法从我的代码隐藏中访问Widget类。在编译时是否有一些关于UserControl可见性的规则,我不知道?如何从info.ascx.cs的代码隐藏中访问Widget类?
谢谢!
答案 0 :(得分:3)
首先,您需要创建一个接口并将其实现到Widget用户控件类。
例如,
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;
}
答案 1 :(得分:0)
在您的情况下,最好使用一些服务器对象,如ViewState或Session。在页面上的DataTable中填充它,并在info.ascx用户控件上的Page_load事件处理程序中获取它。