Доступ к пользовательским элементам управления в коде в ASP.NET - PullRequest
1 голос
/ 19 октября 2011

Этот вопрос для гуру ASP.NET.Это сводит меня с ума.

Я унаследовал приложение ASP.NET Web Forms.Это приложение использует сложную структуру вложенных пользовательских элементов управления.Хотя это и сложно, в этом случае кажется необходимым.Несмотря на это, у меня есть страница, которая использует один UserControl.Мы назовем этот элемент управления UserControl root.Этот 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;
}

Мне действительно нужно получить значение "Записиmsgstr "свойство из родительского элемента управления.К сожалению, я не могу получить доступ к классу Widget из моего кода.Есть ли какие-то правила о видимости UserControl во время компиляции, о которых я не знаю?Как получить доступ к классу Widget из кода info.ascx.cs?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Во-первых, вам нужно создать интерфейс и реализовать его в классе пользовательского элемента управления 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;
}
0 голосов
/ 19 октября 2011

В вашем случае, возможно, лучше использовать какой-нибудь объект сервера, например ViewState или Session. Заполните его в DataTable на своей странице и получите в обработчике событий Page_load на пользовательском элементе управления info.ascx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...