none
Referenciar Controles diferentes RRS feed

  • 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!

    sexta-feira, 23 de maio de 2008 17:34

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.

    segunda-feira, 26 de maio de 2008 11:47
  • 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); 

    }

     

    public void wfGridView1_RowCommand(object sender, GridViewCommandEventArgs e)

    {

          (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!

    segunda-feira, 26 de maio de 2008 17:20

Todas as Respostas

  • Ola,

    Talvez com algum trabalho, o método FindControl deva ajudar.

    domingo, 25 de maio de 2008 22:01
    Moderador
  • Fala ae Israel...

    Não sei como vou usar o FindControl se não consigo referenciar o DetailsView.

    É complicada a Situação companheiro...

     

    segunda-feira, 26 de maio de 2008 02:24
  • 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.

    segunda-feira, 26 de maio de 2008 11:02
    Moderador
  • 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!

     

    segunda-feira, 26 de maio de 2008 11:29
  • 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.

    segunda-feira, 26 de maio de 2008 11:47
  • 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); 

    }

     

    public void wfGridView1_RowCommand(object sender, GridViewCommandEventArgs e)

    {

          (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!

    segunda-feira, 26 de maio de 2008 17:20
  • 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.

    segunda-feira, 26 de maio de 2008 21:50
  • 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.

     

     

    terça-feira, 27 de maio de 2008 13:35