CRIAR FUN?ÃO DINAMICA

PATYFF 13/03/2016 13:07:04
#459076
Pessoal bom dia a todos, estou usando essa função para calcular idade:
 private void txtNascimento_TextChanged(object sender, EventArgs e)
{
DateTime dt;
bool ret = DateTime.TryParse(txtNascimento.Text, out dt);
if (ret)
{
int anos = DateTime.Now.Year - dt.Year;
if (DateTime.Now.Month < dt.Month || (DateTime.Now.Month == dt.Month && DateTime.Now.Day < dt.Day))
{
anos--;
txtIdade.Text = (anos.ToString() + [Ô] Anos[Ô]);
}
if ((anos < 1) || (txtIdade.Text == [Ô]0 Anos[Ô]))
{
TimeSpan dif = dt.Subtract(DateTime.Now);
txtIdade.Text = ((dif.Days / 30) + [Ô]
Meses: [Ô]).Replace([Ô]-[Ô], [Ô] [Ô]);
}
}
}

Eu adaptei desta aqui: Fonte:
static void Main(string[] args){
// vamos obter a diferença em anos, meses ou dias entre
// duas datas
DateTime data_inicial = new DateTime(2008, 4, 10); // 10/04/2008
DateTime data_final = new DateTime(2008, 5, 15); // 15/05/2008

// obtém a diferença
TimeSpan dif = data_final.Subtract(data_inicial);

// exibe o resultado
System.Console.WriteLine([Ô]Diferença em:
Anos: [Ô] +
(dif.Days / 365) + [Ô]
Meses: [Ô] + (dif.Days / 30) +
[Ô]
Dias: [Ô] + dif.Days);

// pausa o programa
Console.ReadKey();
}


Eu preciso colocar a função que estou usando em uma classe e
chama-la em cada textbox que farei o cálculo das datas.
Eu não quero copiar e colar o código em todas elas pois era assim
que fazia no VB6 e sei que assim está errado.

Agradeço desde já meus amores....
GANDA.NICK 13/03/2016 15:03:22
#459077
Resposta escolhida
crias uma função/metodo que te retorne a idade dando como parâmetro a data. (em texto (string), ou mesmo a textBox). Neste exemplo foi usado o texto (string).

E é melhor chamar esse metodo no evento Leave em vez do TextChanged

private string getIdade(string nascimento)
{
DateTime dt;
// Não precisa de criar a variavel bool rect, podes fazer o if logo directamente do resultado do TryParse
if (DateTime.TryParse(nascimento, out dt))
{
int anos = DateTime.Now.Year - dt.Year;
if (DateTime.Now.Month < dt.Month || (DateTime.Now.Month == dt.Month && DateTime.Now.Day < dt.Day))
{
// pode não entrar neste if, por isso o return anos + [Ô] Anos[Ô]; está fora do if
anos--;
}
if (anos < 1)
{
// não é bem a melhor maneira que fazer isto, mas não falha por muito
TimeSpan dif = DateTime.Now.Subtract(dt);
return [Ô]Meses: [Ô] + (dif.Days / 30);
}
// Não precisas usar o .ToString() porque estás a concatenar (+) uma string ([Ô] Anos[Ô]) ao int
return anos + [Ô] Anos[Ô];
}
else
{
MessageBox.Show([Ô]Data de Nascimento invalida![Ô], [Ô]Erro[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error);
return string.Empty;
}

}

private void txtNascimento_Leave(object sender, EventArgs e)
{
txtIdade.Text = getIdade(txtNascimento.Text);
}
PATYFF 13/03/2016 15:34:49
#459078
Obrigada, funcionou exatamente como eu precisava.
KERPLUNK 13/03/2016 17:23:06
#459083
Você pode criar um método de extensão para o tipo DateTime que faça isso. Veja esse Fiddle
Tópico encerrado , respostas não são mais permitidas