Como acessar .Net elemento na página Principal de uma página de Conteúdo?
Pergunta
É possível acessar um elemento em uma página Mestra a partir da página carregada dentro do ContentPlaceHolder
para o mestre?
Eu tenho um ListView com listas de nomes de pessoas em uma área de navegação na página Principal.Eu gostaria de atualizar o ListView depois que uma pessoa foi adicionado à tabela que o ListView é dependente de dados para.O ListView
atualmente não actualização dos valores até que o cache é recarregado.Descobrimos que apenas re-executar o ListView.DataBind()
irá atualizar um listview do conteúdo.Não temos sido capazes de executar o ListView.DataBind()
em uma página que usa a página Principal.
Abaixo está um exemplo do que eu queria fazer, mas um erro do compilador diz
"PeopleListView não existe no actual contexto"
GIS.mestre - Onde reside ListView
...<asp:ListView ID="PeopleListView"...
GISInput_People.aspx - Usa sistemas de informação geográfica.mestre, como é página principal
GISInput_People.aspx.cs
AddNewPerson()
{
// Add person to table
....
// Update Person List
PeopleListView.DataBind();
...
}
Qual seria a melhor maneira de resolver um problema como este em C# .Net?
Solução
Eu acredito em você poderia fazer isso usando este.O mestre.FindControl ou algo semelhante, mas você provavelmente não deve - requer o conteúdo da página, para saber muito sobre a estrutura da página-mestre.
Gostaria de sugerir outro método, como o disparo de um evento na área de conteúdo que o mestre pudesse ouvir e re-bind quando acionado.
Outras dicas
Assumindo o controle é chamado de "PeopleListView" na página mestre
ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();
Mas @palmsey é mais correto, especialmente se a sua página pode ter a possibilidade de mais de uma página principal.Dissociar-los e usar um evento.
Opção 1 :você pode criar a propriedade pública da sua página mestra de controle
public TextBox PropMasterTextBox1
{
get { return txtMasterBox1; }
set { txtMasterBox1 = value; }
}
acessá-lo na página de conteúdo, como
Master.PropMasterTextBox1.Text="SomeString";
Opção 2:na página Principal:
public string SetMasterTextBox1Text
{
get { return txtMasterBox1.Text; }
set { txtMasterBox1.Text = value; }
}
na Página de Conteúdo:
Master.SetMasterTextBox1Text="someText";
opção 3 :você pode criar algum método público que funciona para você
estes abordagem não é tão útil, mas ajuda se você quer apenas usar alguns limitado e pré-definido de controle
Pensar a lembrar é o seguinte ASP.NET directiva.
<%@ MasterType attribute="value" [attribute="value"...] %>
Ele vai ajudar você ao fazer referência a este.Mestre pela criação de uma rigidez de referência para a página principal.Você pode, em seguida, fazer referência a sua ListView sem a necessidade de LANÇAR.
você pode acessar com o código de presente.O mestre.FindControl(ControlID) o controle que você deseja.Ele retorna a referência do controle, de modo que as alterações são efetivas.sobre disparando um evento pode não ser possível em cada situação.
Assumindo que o seu mestre página foi nomeado MyMaster:
(Master as MyMaster).PeopleListView.DataBind();
Editar: desde PeopleListView será declarada protegida por padrão, será necessário alterar este público, ou criar uma propriedade pública wrapper para que você pode acessá-lo a partir de sua página.