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

Каким будет лучший способ разрешить такую ​​проблему в С#.Net?

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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


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

Ответ 4

Можно подумать, что это следующая директива ASP.NET.

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

Ссылка MSDN

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

Ответ 5

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

Ответ 6

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

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

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