Notícias

28.4.09

C# Receita #1

Estou usando o livro C# 3.0 Cookbook que ganhei durante o Pantanet Seminars I e ao procurar algumas receitas, vi que elas não constavam no livro, então resolvi publicar essas receitas nos mesmos moldes do livro. Claro que elas não serão tão didáticas e discutidas como no livro, mas o que vale é a intenção. Então o didatismo e a discussão dependerá dos comentários e dúvidas postados.
Como mesclar 2 vetores
Quando você tem um array e quer mesclar (unir) com outro array, não existe um método para isso como numa Lista, por exemplo, então é necessário fazer uma gambiarra. Nesta receita tenho 2 arrays a1 e a2, e quero uni-los no array a3:
string[] a1 = { "dog", "dock", "deer" };
string[] a2 = { "lion", "tiger" };
string[] a3 = new string[a1.Length + a2.Length];
a1.CopyTo(a3, 0);
a2.CopyTo(a3, a1.Length);
Simples e conciso.
Outro caso poderia ser se você quisesse unir a2 a a1, como no C# não há como redimensionar arrays dinamicamente como no VB.Net, ou você pode atribuir a3 a a1, ou então usar uma função auxiliar para redimensionar a1 e depois copiar os valores de a2 para a1, como abaixo:
int pos = a1.Length;
a1  = RedimArray(a1, a1.Length + a2.Length);
a2.CopyTo(a1, pos);
Abaixo uma função para expandir arrays:
/// <summary>
/// Realoca um vetor com um novo tamanho, e copia seu 
/// conteúdo para o novo vetor.
/// </summary>
/// <param name="oldArray">o vetor antigo, a ser realocado.</param>
/// <param name="newSize">o tamanho do novo vetor.</param>
/// <returns>Um novo vetor com o mesmo conteúdo.</returns>

public static System.Array RedimArray(System.Array vetor, int novoTamanho)
{
    int tamanhoAnt = vetor.Length;
    System.Type tipo = vetor.GetType().GetElementType();
    System.Array novoVetor = System.Array.CreateInstance(tipo, novoTamanho);
    int tamanho = System.Math.Min(tamanhoAnt, novoTamanho);
    if (tamanho > 0)
        System.Array.Copy(vetor, novoVetor, tamanho);
    return novoVetor;
}
Porém caso fosse necessário fazer muitos redimensionamentos é recomendado usar uma Lista ou alguma outra coleção, especialmente se os vetores forem grandes ou com objetos de grande tamanho.

Technorati Tags: ,,,



9.4.09

Como não deixar selecionar data anterior a atual no CalendarExtender

O AJAX Control Toolkit tem um controle chamado CalendarExtender, que exibe um calendário para seleção de data ao clicar em um textbox. Muitas vezes queremos que o usuário selecione somente uma data futura.

Para fazer isso basta adicionar no header a seguinte função javascript:

function checkDate(sender,args)

{
if(sender._selectedDate < new Date()) 
{
            alert("Você não pode selecionar uma data passada!");
            sender._selectedDate = new Date();
            // seleciona a data atual novamente
sender._textbox.set_Value(sender._selectedDate.format(sender._format))
}
}

E adicionar a referencia a esse função no CalendarExtender, como no exemplo abaixo:

<formid="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<cc1:CalendarExtender ID="CalendarExtender1"
runat="server" OnClientDateSelectionChanged="checkDate" TargetControlID="TextBox1" />
</div>
</form>

Share