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