none
Pegar dados dentro de uma datagrid RRS feed

  • Pergunta

  • Montei uma DataGrid manualmente

           <data:DataGrid x:Name="Datagrid1" Grid.Row="1" Grid.ColumnSpan="2" Margin="5" AutoGenerateColumns="False" FontSize="16">
                
                <data:DataGrid.Columns>
                    <data:DataGridTemplateColumn Header=""  >
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Apagar" x:Name="CMD_APAGAR" Click="Button_Click" />
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
    
                    <data:DataGridTemplateColumn Header=""  >
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock x:Name="LBL_ID" Text="{Binding ID}"></TextBlock>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
    
    
                    <data:DataGridTemplateColumn Header="Nome">
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock x:Name="LBL_NOME" Text="{Binding NOME}"></TextBlock>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
    
                    <data:DataGridTemplateColumn Header="UF">
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock x:Name="LBL_UF" Text="{Binding UF}"></TextBlock>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                </data:DataGrid.Columns>
                
            </data:DataGrid>    


    Como eu faço para que quando clicar no botão CMD_APAGAR eu cosiga pegar os dados do campo LBL_ID
    Obrigado
    segunda-feira, 30 de março de 2009 18:28

Respostas

  • Júnior,

    Da maneira que eu fiz, ele pega o registro do Grid.

    Ou seja, no primeiro caso (onde lista todas as cidades), quando o usuário João clicar em algum dos registros, pelo código eu vou capturar o index da linha dentro do grid. Depois eu irei selecionar esta linha, criar um item e receber o conteúdo daquela linha.

    No segundo caso é a mesma coisa, ele irá pegar o index do registro e capturar o conteúdo daquela linha.

    Entenda que o index não é o ID, o Index é a posição do registro no DataGrid. Depois pelo index você consegue capturar a linha do grid e obter o ID do registro selecionado.

    Abraço,

    "Se sua pergunta foi respondida, por favor, marque como resposta"
    • Marcado como Resposta Jjunior75 quinta-feira, 2 de abril de 2009 14:37
    quinta-feira, 2 de abril de 2009 11:17
    Moderador

Todas as Respostas

  • Olá Júnior.

    Fiz alguns testes aqui e deu certo. Segue o exemplo:

    private void CMD_APAGAR_Click(object sender, RoutedEventArgs e)
            {
    
                var selectedIndex = DataGridRow.GetRowContainingElement(sender as FrameworkElement).GetIndex();
    
                Datagrid1.SetValue(DataGrid.SelectedIndexProperty, selectedIndex);
     
    
    SilverlightDataBase.ServicoWCF.CHK_ITEM item = new SilverlightDataBase.ServicoWCF.CHK_ITEM();
    item = (SilverlightDataBase.ServicoWCF.CHK_ITEM)Datagrid1.SelectedItem; txtId.Text = item.NOME.ToString(); }

    A minha var SelectedIndex vai receber o index da linha que o botão foi clicado. Depois disto, eu adiciono a propriedade do grid SelectedIndexProperty como o valor da linha. Isto é feito para que a linha do botão clicado seja selecionada.

    Agora eu criarei um objeto chamado "item". Ele deverá ser do mesmo tipo de dados que meu WCF retornará. Para referenciar este tipo, utilize o nome do projeto (SilverlightDataBase, no meu caso), o nome do WCF (ServicoWCF) e o nome de sua tabela (CHK_ITEM). Depois atribua a este objeto o valor selecteditem de seu datagrid.

    Agora você conseguirá pegar o campo que precisa ao digitar item.

    Não sei se é a melhor maneira de se fazer isto, mas é funcional desta forma.

    Abraços.

    "Se sua pergunta foi respondida, por favor, marque como resposta"
    terça-feira, 31 de março de 2009 14:48
    Moderador
  • Agora eu criarei um objeto chamado "item". Ele deverá ser do mesmo tipo de dados que meu WCF retornará. Para referenciar este tipo, utilize o nome do projeto (SilverlightDataBase, no meu caso), o nome do WCF (ServicoWCF) e o nome de sua tabela (CHK_ITEM). Depois atribua a este objeto o valor selecteditem de seu datagrid

    E ai Lucas, vlw pela resposta.
    So não entendi duas coisas 

    1 - Pq o WCF tem de retornar algum dado se os dados a serem pegos estão dentro do datagrid??

    2 - Digamos q tenha o seguinte datagrid

    Exemplo:
    O datagrid

               ID     CIDADE            UF
    botão   1       São paulo         SP
    botão   2       Rio de janeiro   RJ
    botão   3       Goiânia            GO

    Cliquei no botão na linha onde o ID é igual a 2 que esta em um campo textblock como mostrado no codigo q abriu o post.
    Desta forma eu consigo pegar o valor deste textblock ou de um textbox ou qq outro controle??

    Obrigado
    terça-feira, 31 de março de 2009 22:33
  • Junior, os dados que seu datagrid está usando na propriedade itemsource está vindo de um WCF? Na verdade eu criei este item apartir do WCF pois os dados dentro do datagrid são deste tipo. Faço isto apenas para armazenar os dados que estão dentro daquela linha neste item.

    No exemplo que você disse, ao clicar no botão, ele pegaria a posição (index) do botão dentro do datagrid.  Na segunda linha eu seleciono a linha que o botão clicado está. Aí eu criei o meu item, este item tem que ser do mesmo tipo das linhas de seu datagrid. No meu exemplo, meu datagrid recebe os dados de um WCF, por isto criei o meu item com o mesmo tipo do WCF, pois será mantida as colunas exatas do banco.

    Depois atribuo ao item o valor do item selecionado.

    Desta forma, ao digitar item, serão listadas as colunas de seu banco e você conseguira receber qualquer valor da linha selecionada. Caso você só precise do index, apenas a primeira linha do meu código já funcionará (quando eu defino um valor para selectedIndex).

    Agora se você precisa de algum campo que está dentro do seu datagrid, deverá ser feito todo este código.

    Abraço.
    terça-feira, 31 de março de 2009 22:59
    Moderador
  • E ai Lucas, valeu pela resposta, agora eu entendi

    Mas vamos dizer o seguinte:
    O usuario João pegou  toda a lista de cidades

               ID     CIDADE            UF
    botão   1       São paulo         SP
    botão   2       Rio de janeiro   RJ
    botão   3       Goiânia            GO

    Logo em seguida o usuario Mario pegou a lista de cidades que começão com R a partir de outro computador

               ID     CIDADE            UF
    botão   2       Rio de janeiro   RJ

    Após a pesquisa do usuario Mario, se o usuario João clicar no botão onde a linha tem o  ID é igual a 1 ele verá o Nome São Paulo?? Ou verá Rio de Janeiro ja que o usuario Mario fez uma consulta logo depois a do João.
    quarta-feira, 1 de abril de 2009 23:00
  • Júnior,

    Da maneira que eu fiz, ele pega o registro do Grid.

    Ou seja, no primeiro caso (onde lista todas as cidades), quando o usuário João clicar em algum dos registros, pelo código eu vou capturar o index da linha dentro do grid. Depois eu irei selecionar esta linha, criar um item e receber o conteúdo daquela linha.

    No segundo caso é a mesma coisa, ele irá pegar o index do registro e capturar o conteúdo daquela linha.

    Entenda que o index não é o ID, o Index é a posição do registro no DataGrid. Depois pelo index você consegue capturar a linha do grid e obter o ID do registro selecionado.

    Abraço,

    "Se sua pergunta foi respondida, por favor, marque como resposta"
    • Marcado como Resposta Jjunior75 quinta-feira, 2 de abril de 2009 14:37
    quinta-feira, 2 de abril de 2009 11:17
    Moderador
  • Sim... sem dúvida... quando tens uma nova ItemSource... ele vai buscar sempre os valores das linhas...
    Logo, o valor da linha do objecto X antes da remoção não é igual depois da remoção ser efectuada...

    Agora coloquei aqui este POST devido a uma falha na DataGrid...

    Lista1 (A,B,C)
    DataGrid.ItemSource(Lista1);
    Lista1.Remove(A);
    DataGrid.ItemSource(Lista1);

    A DataGrid sempre que faz um ItemSource... devia actualizar os seus valores... mas não acontece...

    Apenas funciona caso seja colocada a Datagrid.ItemSource=null antes de fazer a nova Source...

    Pode-se chamar a isto um FALHA?

    Abraços
    sexta-feira, 17 de abril de 2009 15:57