segunda-feira, 28 de junho de 2010

(Invocar função no controle Pai) Delegate Com UserControl.ascx

Primeiro vamos criar o controle ascx

Insira um botão no controle ascx

No código do controle declare um delegate
e um evento dentro da classe.


public

delegate void
delChamarEvento();


public
event delChamarEvento evChamarEvento;




no evento click do botão chame o evento.


this
.evChamarEvento();


Agora vamos para a pagina aspx



Insira o controle dentro da pagina



Note que na parte superior será registrado o controle





<%
@ Register src="uscEventos.ascx"  tagname="uscEventos" tagprefix="uc1" %>




No
meu caso uscEventos é o nome do meu controle





Insira um label na pagina para visualizarmos o resultado


<
asp:Label ID="lblMensagem" runat="server" Text=""></asp:Label>





Crie qualquer metodo na pagina para ser executa pelo controle





public

void ExecutarEvento()

{

         lblMensagem.Text = "Evento do controle  ";      

}







No
load da pagina sobrescreva o evento do controle passando o seu metodo da pagina





protected
void Page_Load(object sender, EventArgs e)

{

    uscEventos1.evChamarEvento+=newcEventos.delChamarEvento(ExecutarEvento);

}





Agora é só testar


Observe que quando clicar no botão do controle, o metodo ExecutarEvento() dentro
da pagina aspx é executado.

Yield?

É algo já não tão novo, apareceu no C# 2.0, e só existe no C#, não existe no VB.

O yield serve para gerar um Enumerable on demand. Por exemplo, se você quiser
criar uma coleção de inteiros rapidamente, como faz? Veja abaixo, com yield:

public static IEnumerable<int> GetNums(int from, int to)
{
    for (int i = from; i <= to; i++)
        yield return i;
}

Legal, né? Para usar é fácil, verificamos com um teste:

[TestMethod()]
public void GetNumsTest()
{
    var nums = Class1.GetNums(2, 5);
    Assert.AreEqual(4, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(3));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(5));
}

Gosto bastante também do exemplo
do MSDN:

public static IEnumerable<int> Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter++ < exponent)
    {
        result = result * number;
        yield return result;
    }
}

Mais uma vez, para testar:

[TestMethod]
public void PowerTest()
{
    var nums = Class1.Power(2, 5);
    Assert.AreEqual(5, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(8));
    Assert.IsTrue(nums.Contains(16));
    Assert.IsTrue(nums.Contains(32));
}

Mas o yield não é para ser usado somente com inteiros, você pode usá-lo para
retornar um IEnumerable de qualquer coisa. Aqui um exemplo com strings:

public static IEnumerable<string> GetWordsUpper(string phrase)
{
    foreach (var word in phrase.Split(' '))
    {
        yield return word.ToUpper();
    }
}

Para testar é fácil:

[TestMethod]
public void GetWordsUppderTest()
{
    var palavras = Class1.GetWordsUpper("ola como vai?");
    Assert.AreEqual(3, palavras.Count());
    Assert.IsTrue(palavras.Contains("OLA"));
    Assert.IsTrue(palavras.Contains("COMO"));
    Assert.IsTrue(palavras.Contains("VAI?"));
}

Você pode levar isso longe, como obtenção de dados do banco, obtenção de input
do usuário, tudo somente quando precisar, e por aí vai.

E você, já usou o yield? Gosta? Onde? Comente aqui.