Как получить доступ к элементу .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?

8.08.2008 21:39:04
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

17
8.08.2008 21:46:22

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

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

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

-1
8.08.2008 21:49:18

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

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

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

3
23.05.2017 12:00:46

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

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

Справочник по MSDN

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

1
23.08.2008 02:33:55

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

0
8.04.2011 07:08:36

Вариант 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: вы можете создать публичный метод, который работает для вас


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

2
7.02.2016 18:05:37
Спасибо, это работает. Тем не менее, вам нужно привести его: ((myMasterPage) Master) .SetMasterTextBox1Text = "someText";
Serguei Fedorov 3.07.2013 16:01:42
это зависит от вашей реализации ... для одной главной страницы это не требуется. и ваша реальная реализация будет намного сложнее, чем такой базовый пример (например, Print «Hello World!»)
BrainCoder 5.07.2013 09:30:12
Это метод, который я использовал, без дополнительных изменений Сергея. Работает очень хорошо, делает именно то, что мне нужно. Наверное, следовало отметить и ответ. +1
James 13.03.2014 14:41:05