Можно ли получить доступ к элементу на 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?
Я полагаю, что вы могли бы сделать это, используя this.Master.FindControl или что-то подобное, но вам, вероятно, не следует - для этого требуется, чтобы страница содержимого слишком много знала о структуре главной страницы.
Я бы предложил другой метод, например, запуск события в области содержимого, который мастер мог прослушивать и повторно связывать при срабатывании.
Предполагая, что ваша главная страница была названа MyMaster:
(Master as MyMaster).PeopleListView.DataBind();
Изменить: поскольку PeopleListView будет объявлен защищенным по умолчанию, вам нужно либо изменить его на public, либо создать обертку открытого свойства, чтобы вы могли получить к ней доступ со своей страницы.
Предполагая, что элемент управления называется «PeopleListView» на главной странице
ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();
Но @ palmsey более корректен, особенно если на вашей странице может быть несколько главных страниц. Разъедините их и используйте событие.
Следует помнить следующую директиву ASP.NET.
<%@ MasterType attribute="value" [attribute="value"...] %>
Это поможет вам при ссылке на this.Master, создав строго типизированную ссылку на главную страницу. Затем вы можете ссылаться на свой ListView без необходимости CAST.
Вы можете получить доступ с кодом this.Master.FindControl (ControlID), который вы хотите контролировать. Возвращает ссылку на элемент управления, чтобы изменения вступили в силу. Про стрельбу на событии не могло быть возможно в каждой ситуации.
Вариант 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: вы можете создать публичный метод, который работает для вас
этот подход не так полезен, но он помогает, если вы просто хотите использовать некоторые ограниченные и предопределенные элементы управления