Usuário com melhor resposta
Referenciar Controles diferentes

Pergunta
-
Olá senhores,
Tenho uma página aspx com dois controles; um DetailsView e um WebUserControl. Dentro do WebUserControl, tenho um GridView.
Eu preciso que acessar o DetailsView de dentro do GridView que está no WebUserControl, isso a partir doevento RowCommand do Grid. Seria algo mais ou menos assim:
protected
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e){
if (e.CommandName == "Selecionar"){
DetailsView1.ChangeMode(
DetailsViewMode.Insert);}
}
Mas quando eu digito "DetailsView" o intelisense não mostra o DetailsView1, ou seja, não consigo acessá-lo de dentro do WebUserControl. Alguém sabe como fazer isso?
Obrigado!
Respostas
-
Já tentou assim:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Selecionar"){
DetailsView
DetailsView1 = (DetailsView)this.Page.FindControl("DetailsView1");DetailsView1.ChangeMode(
DetailsViewMode.Insert);}
}
Mas como o Israel disse, toda vez que usar esse UC, vc terá que colocar o DetailsView1 no webForm.
Uma saida seria criar um evento no UC que será instanciado ou não pelo webForm que o carregar.
// no UserControl
// Crio uma instancia do evento a ser manipulado no UC
public event EventHandler evGridView1_RowCommand = null;// Evento no UC que será detectado pelo WebForm.
protected void GridView1_RowCommand(object sender, EventArgs e){
if (evGridView1_RowCommand != null)evGridView1_RowCommand(sender, e);
}
-------------------- // --------------------------
// no webForm:
// Instancio o evento do UC com o nome do evento que será usado no WebForm.
protected void Page_Load(object sender, EventArgs e){
UcCategoria1.evGridView1_RowCommand+=
new EventHandler(wfGridView1_RowCommand);}
// Evento do WF
public void wfGridView1_RowCommand(object sender, EventArgs e){
DetailsView1.ChangeMode(DetailsViewMode.Insert);
}
espero que ajude.
-
Grande Fábio,
Cara Show de bola sua dica, mas em meu código precisei fazer algumas alterações pra funcionar como eu queria, ficou assim:
No WUC:
public
event GridViewCommandEventHandler evGvBuscaCliente_RowCommand = null;protected void gvBuscaCliente_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (evGvBuscaCliente_RowCommand != null)
{
evGvBuscaCliente_RowCommand(sender, e);
}
}
E na página aspx:
protected
void Page_Load(object sender, EventArgs e){
wucBuscaCliente1.evGvBuscaCliente_RowCommand +=
new GridViewCommandEventHandler (wfGridView1_RowCommand);}
{
(dvDadosContaRec.FindControl("txtCodCliente") as TextBox).Text = e.CommandArgument.ToString();}
Obs.
No método gvBuscaCliente_RowCommand do WUC precisei trocar sua assinatura de EventArgs para GridViewCommandEventArgs, da mesma forma no método wfGridView1 da página aspx, pois Deixando apenas EventArgs, o argumento e não me trazia a propriedade CommandArgument e é nela que tenho o meu IdCliente.
Agora ficou filé, valew mwsmo pela força.
Cara, só não entendi esse método:
public void wfGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
(dvDadosContaRec.FindControl("txtCodCliente") as TextBox).Text = e.CommandArgument.ToString();}
Quer dizer... o que ele faz eu entendi, não entendi o nome dele wfGridView1_RowCommand, onde declarei esse evento? Ele não existe em lugar nenhum.
Vlw!
Todas as Respostas
-
-
-
Ola,
O WebUserControl (ASCX) tem uma propriedade chamada Page que retorna uma instância da página que hospeda o controle.
Através desta propriedade, você conseguirá recuperar o Details. O problema disso é a dependência que você causa, pois esse código obrigará a todas as páginas que você colocar este ASCX deverá ter o DetailsView. -
Fala Israel,
Bom dia!
Entendi o que quiz dizer cara... você tem razão. Tem alguma idéia de como posso resolver esse problema? Preciso enviar o código do cliente que selecionei no Gridview dentro do WebUserControl, para um campo no template EDit do DetailsView.
Obrigado pelo Help!
-
Já tentou assim:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Selecionar"){
DetailsView
DetailsView1 = (DetailsView)this.Page.FindControl("DetailsView1");DetailsView1.ChangeMode(
DetailsViewMode.Insert);}
}
Mas como o Israel disse, toda vez que usar esse UC, vc terá que colocar o DetailsView1 no webForm.
Uma saida seria criar um evento no UC que será instanciado ou não pelo webForm que o carregar.
// no UserControl
// Crio uma instancia do evento a ser manipulado no UC
public event EventHandler evGridView1_RowCommand = null;// Evento no UC que será detectado pelo WebForm.
protected void GridView1_RowCommand(object sender, EventArgs e){
if (evGridView1_RowCommand != null)evGridView1_RowCommand(sender, e);
}
-------------------- // --------------------------
// no webForm:
// Instancio o evento do UC com o nome do evento que será usado no WebForm.
protected void Page_Load(object sender, EventArgs e){
UcCategoria1.evGridView1_RowCommand+=
new EventHandler(wfGridView1_RowCommand);}
// Evento do WF
public void wfGridView1_RowCommand(object sender, EventArgs e){
DetailsView1.ChangeMode(DetailsViewMode.Insert);
}
espero que ajude.
-
Grande Fábio,
Cara Show de bola sua dica, mas em meu código precisei fazer algumas alterações pra funcionar como eu queria, ficou assim:
No WUC:
public
event GridViewCommandEventHandler evGvBuscaCliente_RowCommand = null;protected void gvBuscaCliente_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (evGvBuscaCliente_RowCommand != null)
{
evGvBuscaCliente_RowCommand(sender, e);
}
}
E na página aspx:
protected
void Page_Load(object sender, EventArgs e){
wucBuscaCliente1.evGvBuscaCliente_RowCommand +=
new GridViewCommandEventHandler (wfGridView1_RowCommand);}
{
(dvDadosContaRec.FindControl("txtCodCliente") as TextBox).Text = e.CommandArgument.ToString();}
Obs.
No método gvBuscaCliente_RowCommand do WUC precisei trocar sua assinatura de EventArgs para GridViewCommandEventArgs, da mesma forma no método wfGridView1 da página aspx, pois Deixando apenas EventArgs, o argumento e não me trazia a propriedade CommandArgument e é nela que tenho o meu IdCliente.
Agora ficou filé, valew mwsmo pela força.
Cara, só não entendi esse método:
public void wfGridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
(dvDadosContaRec.FindControl("txtCodCliente") as TextBox).Text = e.CommandArgument.ToString();}
Quer dizer... o que ele faz eu entendi, não entendi o nome dele wfGridView1_RowCommand, onde declarei esse evento? Ele não existe em lugar nenhum.
Vlw!
-
Oi Leo,
na verdade eu peguei esse codigo que estava na minha aplicação e substitiu o _SelectedIndexChanged (q estava na minha) pelo _RowCommand, por isso que deu erro nas assinaturas.
No Page_Load você esta dizendo que: quando for executado o evento wucBuscaCliente1.evGvBuscaCliente_RowCommand que está no WUC, ele irá executar o seu wfGridView1_RowCommand do aspx.
wucBuscaCliente1.evGvBuscaCliente_RowCommand += new GridViewCommandEventHandler (wfGridView1_RowCommand);
entendeu?
No final das contas, quando você executar o RowCommand do GridView que esta no WUC, ele irá executar o
public void wfGridView1_RowCommand(object sender, GridViewCommandEventArgs e).
eu coloco wf antes do nome do metodo para falar que é do WebForms e uc para os eventos do WUC.
-
Fala ae Fábio,
Show de bola meu brother, entendi. É que eu fiquei com dúvida pois o meu grid no WebForm não se chama wfgridview e eu coloquei no código assim como você, wfgridview e funcionou, por isso q fiquei na dúvida, pois o wfgridview foi só um exemplo citado por vc, na minha aplicação ele não existe, mas mesmo assim funcionou. Queria saber que espírito louco fez o compilador reconhecer ele hehe.