Как получить доступ к элементу .Net на главной странице со страницы содержимого?

Можно ли получить доступ к элементу на ContentPlaceHolder главной странице со страницы, загруженной в мастер-страницу ?

У меня есть ListView, в котором перечислены имена людей в области навигации на главной странице. Я хотел бы обновить ListView после того, как человек был добавлен в таблицу, к которой привязаны данные ListView. В ListView настоящее время не обновляет свои значения, пока кеш не будет перезагружен. Мы обнаружили, что простой повторный запуск ListView.DataBind() обновит содержимое списка. Нам не удалось запустить ListView.DataBind() на странице, которая использует главную страницу.

Ниже приведен пример того, что я хотел сделать, но ошибка компилятора говорит

«PeopleListView не существует в текущем контексте»

GIS.master - Где находится ListView

...<asp:ListView ID="PeopleListView"...

GISInput_People.aspx - использует GIS.master в качестве главной страницы

GISInput_People.aspx.cs

AddNewPerson()
{
    // Add person to table
    ....

    // Update Person List
    PeopleListView.DataBind();
    ...
}

Как лучше всего решить подобную проблему в C# .Net?

Ответов (6)

Решение

Я считаю, что вы могли бы сделать это, используя this.Master.FindControl или что-то подобное, но вам, вероятно, не следует - это требует, чтобы страница содержимого слишком много знала о структуре главной страницы.

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

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

public TextBox PropMasterTextBox1
{
    get { return txtMasterBox1; }
    set { txtMasterBox1 = value; }
}

получить доступ к нему на странице содержимого, например

Master.PropMasterTextBox1.Text="SomeString";

Вариант 2: на главной странице:

public string SetMasterTextBox1Text
{  
    get { return txtMasterBox1.Text; }
    set { txtMasterBox1.Text = value; }
}

на странице содержимого:

Master.SetMasterTextBox1Text="someText";

вариант 3: вы можете создать какой-нибудь общедоступный метод, который работает для вас


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

Предполагая, что элемент управления называется «PeopleListView» на главной странице.

ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();

Но @ palmsey более правильный, особенно если ваша страница может иметь более одной главной страницы. Разъедините их и используйте событие.

Предполагая, что ваша главная страница была названа MyMaster:

(Master as MyMaster).PeopleListView.DataBind();

Изменить: поскольку PeopleListView будет объявлен защищенным по умолчанию, вам нужно будет либо изменить его на общедоступный, либо создать оболочку общедоступного свойства, чтобы вы могли получить к нему доступ со своей страницы.

Следует помнить о следующей директиве ASP.NET.

<%@ MasterType attribute="value" [attribute="value"...] %>

Справочник MSDN

Это поможет вам при обращении к this.Master, создав строго типизированную ссылку на главную страницу. Затем вы можете ссылаться на свой ListView без необходимости CAST.

вы можете получить доступ с помощью кода this.Master.FindControl (ControlID), который вам нужен. Он возвращает ссылку на элемент управления, чтобы изменения вступили в силу. о стрельбе событие не могло быть возможным в каждой ситуации.