Доступ к базовым свойствам пользовательского элемента управления из дочернего элемента управления - PullRequest
0 голосов
/ 01 декабря 2011

В моем приложении asp.net есть пользовательский базовый пользовательский элемент управления, унаследованный от других пользовательских элементов управления. Этот пользовательский базовый пользовательский элемент управления имеет три свойства, которые были обнародованы. Когда пользовательский элемент управления загружен, пользовательские базовые свойства пользовательского элемента управления равны нулю. Я пытаюсь понять, что я делаю неправильно. Может кто-нибудь, пожалуйста, помогите понять, какой шаг я пропускаю?

пользовательский базовый код загрузки пользовательского элемента управления с родительской страницы:

    private void Render_Modules()
    {
        foreach (OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule item in custompage.Header.Modules)
        {
            if (item.ModuleCustomOrder != 99)
            {
                webonlinecustombase ctl = (webonlinecustombase)Page.LoadControl("../IPAM_Controls/webtemplatecontrols/webonlinecustombase.ascx");
                ctl.Event = Event;
                ctl.custompage = custompage;
                ctl.custommodule = item;
                this.eventprogrammodules.Controls.Add(ctl);
            }
        }
    }

пользовательский базовый код управления пользователем позади

public partial class webonlinecustombase : System.Web.UI.UserControl
{
    public Event Event { get; set; }
    public OnlineSystemPageCustom custompage { get; set; }
    public OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule custommodule { get; set; }

    public void Page_Load(object sender, EventArgs e)
    {
        string typeName = custommodule.ModuleInternetFile;
        inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", "");
        modtitle.InnerText = custommodule.ModuleName;
        Type child = Type.GetType(typeName);

        UserControl ctl = (UserControl)Page.LoadControl(child, null);
        if (ctl != null)
        {
            this.modsection.Controls.Add(ctl);
        }
    }
}

пример кода пользовательского элемента управления, наследующего базовый элемент управления

public partial class eventscientificoverview : webonlinecustombase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (custommodule.ModuleDefaultVerbiage != null && custommodule.ModuleDefaultVerbiage != "") { this.Load_Verbiage(false); }
        else if (custommodule.ModuleCustomVerbiage != null && custommodule.ModuleCustomVerbiage != "") { this.Load_Verbiage(true); }
    }

    protected void Load_Verbiage(bool usecustom)
    {
        if (usecustom) { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleCustomVerbiage; }
        else { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleDefaultVerbiage; }
    }
}

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вы должны вызвать Render_Modules в событии init родительской страницы.

Кроме того, вы можете реструктурировать свои базовые / пользовательские классы, чтобы избежать путаницы в порядке выполнения событий, поскольку событие load будет вызываться как в базовом, так и в пользовательских классах.

Каждый раз, когда у нас есть этот тип структуры, мы всегда реализуем метод OnLoad в базовом классе для переопределения наследниками. Таким образом, мы можем точно контролировать, когда логика загрузки выполняется в наследниках.

Обновлено с дополнительной информацией

Вот некоторая дополнительная информация о том, как обрабатывать события загрузки в базовых и дочерних классах.

В webonlinecustombase добавьте следующее:

protected virtual void OnPageLoad() {
}

затем измените событие загрузки страницы, чтобы вызвать этот новый метод в соответствующее время:

public void Page_Load(object sender, EventArgs e)
{
    string typeName = custommodule.ModuleInternetFile;
    inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", "");
    modtitle.InnerText = custommodule.ModuleName;
    Type child = Type.GetType(typeName);

    UserControl ctl = (UserControl)Page.LoadControl(child, null);
    if (ctl != null)
    {
        this.modsection.Controls.Add(ctl);
    }

    // Now let the inheritors execute their code
    OnPageLoad();
}

затем в вашем унаследованном классе измените:

protected void Page_Load(object sender, EventArgs e)

до

protected override void OnPageLoad()

Когда я просматривал этот код, я обнаружил, что вы также динамически загружаете элементы управления в webonlinecustombase. Вам нужно будет переместить загрузку элементов управления в событие init, чтобы они правильно работали в стандартной логике страницы.

0 голосов
/ 01 декабря 2011

Вы пробовали базу. [PropertyName]?

Если у вас есть новое ключевое слово или переопределение в производном классе, и у вас могут быть только значения в базовом классе, это может быть причиной. Это случилось со мной раньше.

...