A obtenção de dados de controles de filho carregado através de programação
-
27-09-2019 - |
Pergunta
Eu criei 2 controles para manipular um objeto de dados:1 para visualizar e outro para edição.
Em uma página que carregar o "modo de exibição" UserControl
e passar os dados para o desta forma:
ViewControl control = (ViewControl)LoadControl("ViewControl.ascx");
control.dataToView = dataObject;
this.container.Controls.Add(control);
Isso é tudo muito bem e dentro do controle eu posso pegar os dados e exibi-lo.
Agora eu estou tentando seguir uma abordagem semelhante para a edição.Eu tenho um Usuário diferente de Controle para este (com algumas caixas de texto para edição) para que eu passar os dados originais, da mesma forma que eu fiz para o modo de exibição:
EditControl control = (EditControl)LoadControl("EditControl.ascx");
control.dataToEdit = dataObject;
this.container.Controls.Add(control);
O que também funciona bem.
O problema agora está chegando a esses dados.Quando o usuário clica em um botão que eu precisa para obter os dados que foi editada e fazer coisas com ele.O que acontece é que uma vez que os controlos estão sendo adicionados por meio de programação, os dados que o usuário alterou não parecem ser acessíveis em qualquer lugar.
Existe uma solução para isso?Ou é uma forma de tentar manter as coisas separadas e possivelmente re-utilizável não é possível?
Obrigado antecipadamente.
Solução 3
Aqui está a minha solução:
Na página, manter uma referência para o controle que é carregado por meio de programação.No controle, eu criei um GetData() método que retorna um objeto com os dados inseridos pelo usuário.Quando o usuário submete o formulário, a página chama o GetData() método de controle para acessar os dados que o usuário digitou.
Outras dicas
Basta manter uma referência para o controle como uma variável na página code-behind.I. e.
private EditControl control;
protected void Page_Init(object sender, EventArgs e)
{
control = (EditControl)LoadControl("EditControl.ascx");
control.dataToEdit = dataObject;
this.container.Controls.Add(control);
}
protected void Button_Click(object sender, EventArgs e)
{
var dataToEdit = control.dataToEdit;
}
Enquanto você está criando o controle na parte direita da página do ciclo de vida (Inicialização), em seguida, ViewState
será mantida.Eu estou supondo que dataToEdit é apenas um TextBox
ou algo assim?
Controles criados dinamicamente deve ser adicionado em Init
ou PreInit
evento na página.
Você tem que fazê-lo aqui, porque os controles do estado ainda não está carregado.Se você adicionar o controle DEPOIS que você vai tê-los vazios desde que a página já preenchido página de controle de valores cedo no ciclo de vida da página.
Mais informações sobre o ciclo de vida página aqui