terça-feira, 29 de novembro de 2011

Alimentando DataGrid WPF Dinamicamente com C#


                Muitas vezes precisamos alimentar um DataGrid dinamicamente, com o WPF está tarefa ficou bem fácil, vamos ao exemplo.
                Iremos criar um programa para exibir o alfabeto em maiúsculo , um contador e o código ASCII da letra dentro de um DataGrid assim que o usuário pressionar o botão.
                Vamos inserir um botão e um DataGrid, como o intuito aqui é alimentar dinamicamente o DataGrid, vamos alterar a propriedade AutoGenerateColumns  para true dentro do XAML , assim o DataGrid vai gerar as colunas para nós, abaixo segue como o código deve ficar :

<my:datagrid autogeneratecolumns="true" margin="12,42,12,20" name="dataGrid1" xmlns:my="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"> </my:datagrid>
    

                No código vamos criar uma simples classe apenas com os atributos, segue o código:

    public class LetraNumero
    {
        public int Posicao { get; set; }
        public char Letra { get; set; }
        public int ASCII { get; set; }
    }

                Segue o código do evento Click do botão :

         private void button1_Click(object sender, RoutedEventArgs e)
        {   
            // Cria lista para os objetos (está lista tem que ser do tipo Generic)
            List<letranumero> lista = new List<letranumero>();

            // Rotina para alimentar a lista
            for (int i = 1; i < 27; i++)
            {
                LetraNumero item = new LetraNumero();
                item.Posicao = i;
                item.Letra = Convert.ToChar(64 + i);
                item.ASCII = 64 + i;
                lista.Add(item);
            }

             // Vinculando a lista ao grid
             dataGrid1.ItemsSource = lista; 
        }

                A propriedade ItemsSource do DataGrid aceita uma lista do tipo Generic e como a propriedade AutoGenerateColumns está como true, ele vai criar uma coluna para cada atributo da classe definida na lista. Abaixo segue o exemplo da tela em execução:


                Se for preciso, podemos alterar o titulo da coluna (pois ele sempre deixa a coluna com o nome da propriedade da classe) ou mesmo ocultar a coluna. Criei um outro botão com o mesmo código e inserir essas duas linhas, uma para renomear a coluna Posicao para Posição e a outra para ocultar a coluna ASCII:

             // Altera o titulo da coluna 0
            dataGrid1.Columns[0].Header = "Posição";           

            // Deixa a coluna 2 invisivel
            dataGrid1.Columns[2].Visibility = Visibility.Hidden;

                Executando o botão, verifique como ficou a tela:


 Referências: