none
Acessar propriedades e métodos de outro user control.

    Pergunta

  • Galera, boa tarde.

    Estou precisando de ajuda num lance sobre UserControls dinâmicos.

    Observem a imagem...

    Imagem explicativa

    O que eu preciso é o seguinte... quando o usuário mudar o texto que está no WUC1, ele vai chamar um método do WUC3 que vai atualizar o label com um cálculo de acordo com o valor que o usuário digitou.

    Agora o problema é: 1 - como vou executar o a função dentro do controle wuc1 sendo que os usercontrols são colocados dinamicamente na página? Eu já tentei achar o wuc3 pelo "findcontrol" e não consigo... 

    Alguém que já teve esse tipo de experiência pode dar um help?

    Valeu!

    terça-feira, 8 de maio de 2012 19:55

Respostas

  • Ola amigo, acredito que o problema esteja na hora de criar o controle via programação, está fazendo o LoadControl? Segue um exemplo como base no seu problema:

    WUC1.ASCX

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="wuc1.ascx.cs" Inherits="JQTest.AcessarUserControl.wuc1" %>
    <div style="width:300px; height:80px; border:2px solid #000; color:#fff; background-color:Gray;">
        <div style="width:100px; float:left;">
            <span style="font-size:x-large; font-weight:bold;">WUC1</span>
        </div>
        <div style="width:100px; float:right;">
            <asp:TextBox ID="txtInserir" runat="server" AutoPostBack="true" Width="80px" ontextchanged="txtInserir_TextChanged"></asp:TextBox>
        </div>
    </div>

    WUC1.ASCX.CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    namespace JQTest.AcessarUserControl
    {
        public partial class wuc1 : System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
            protected void txtInserir_TextChanged(object sender, EventArgs e)
            {
                wuc3 uc3 = (wuc3)Page.FindControl("pnlControles").FindControl("uc3");            
                uc3.Valor = txtInserir.Text;
            }
        }
    }

    WUC2.ASCX

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="wuc2.ascx.cs" Inherits="JQTest.AcessarUserControl.wuc2" %>
    <div style="width:300px; height:80px; border:2px solid #000; color:#fff; background-color:Gray;">
        <div style="width:100px; float:left;">
            <span style="font-size:x-large; font-weight:bold;">WUC2</span>
        </div>
    </div>

    WUC3.ASCX

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="wuc3.ascx.cs" Inherits="JQTest.AcessarUserControl.wuc3" %>
    <div style="width:300px; height:80px; border:2px solid #000; color:#fff; background-color:gray;">
        <div style="width:100px; float:left;">
            <span style="font-size:x-large; font-weight:bold;">WUC3</span>
        </div>
        <div style="width:100px; float:right;">
            <asp:Label ID="lblvalor" runat="server" BorderColor="White" BorderWidth="2px" BorderStyle="Solid" Width="80px" Height="25px" Text=" "></asp:Label>
        </div>
    </div>

    WUC3.ASCX.CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    namespace JQTest.AcessarUserControl
    {
        public partial class wuc3 : System.Web.UI.UserControl
        {
            public string Valor
            {
                set { lblvalor.Text = value; }
            }
            protected void Page_Load(object sender, EventArgs e)
            {
            }
        }
    }

    ASPX

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AcessaruserControl.aspx.cs" Inherits="JQTest.AcessarUserControl.AcessaruserControl" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Panel ID="pnlControles" runat="server"> </asp:Panel> </div> </form> </body> </html>

    ASPX.CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    namespace JQTest.AcessarUserControl
    {
        public partial class AcessaruserControl : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                wuc1 uc1 = new wuc1();
                wuc2 uc2 = new wuc2();
                wuc3 uc3 = new wuc3();
                uc1 = (wuc1)LoadControl("~/AcessarUserControl/wuc1.ascx");
                uc2 = (wuc2)LoadControl("~/AcessarUserControl/wuc2.ascx");
                uc3 = (wuc3)LoadControl("~/AcessarUserControl/wuc3.ascx");
                uc1.ID = "uc1";
                uc2.ID = "uc2";
                uc3.ID = "uc3";
                pnlControles.Controls.Add(uc1);
                pnlControles.Controls.Add(uc2);
                pnlControles.Controls.Add(uc3);
            }
        }
    }

    Foi bastante código pois tentei deixar o mais parecido com o que você pediu, os pontos importantes são:

    1. O uso do LoadControl para carregar o controle, apenas instanciar o objeto com o new não resolveria.
    2. Adicionar o controle dentro da página com o "Controls.Add". Neste caso ao invés de jogar na pagina joguei dentro de um painel.
    3. Para passar a informação digitada no box do WUC1 para o Label do WUC3 criei uma propriedade(Valor) que recebe a informação e passar para o label. Ao digitar um valor no textbox e sair do mesmo(clique fora do textbox) o evento TextChanged é disparado, faço uma busca na pagina pelo meu painel(onde estão os controles) e busco o "uc3". Ai é so acessar a propriedade(Valor) e passar o texto digitado. Bastaria você adicionar o cálculo que deseja.

    Eis o resultado:

    Caso não tenha entendido alguma parte me avisa. :)


    Rodrigo Reis Ferreira
    Microsoft Certified


    quinta-feira, 10 de maio de 2012 13:06