none
Pegar item da Datagrid WPF RRS feed

  • Pergunta

  • Tenho uma datagrid wpf que mostra os dados do banco de dados normal.

    Eu queria um exemplo de como fazer para o usuario clicar duas vezes em um item da datagrid e esse item clicado preenchesse um textbox de um form que aparecerá quando o usuario clicar duas vezes no item da datagrid ou seleciona-lo e clica-lo no botao selecionar do form que fica a datagrid.

    Eu nao preciso de todos os itens da datagrid, somente de um campo para preencher o textbox do form que aparecerá depois do usuario clicar na datagrid wpf.

    Alguém por favor pode me ajudar?

     

    Ae, será que ninguém pode me dar uma ajudinha?

    passei o dia e noite, procurando de como passar o item que selecionei na datagrid em um form para um textbox em outro form... por favor


    dei mais uma procurada aqui, e vi que existe uma propriedade datagrid1.selectedItem mas nao estou conseguindo associa-la a variavel que ira passar com o dado para preencher no textbox no outro form....

    Vou tentando aqui, se alguém souber me dar um exemplo ficaria muito agradecido

    sexta-feira, 9 de abril de 2010 15:28

Respostas

  • Segundo o que você colocou, os itens da DataGrid são do tipo tb_cores.

    O código que você deve colocar é:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = ((tb_cores)dg.SelectedItem).codigo;
      DialogResult = false;

    }

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Ricardo Duk terça-feira, 13 de abril de 2010 12:24
    terça-feira, 13 de abril de 2010 10:25

Todas as Respostas

  • Ricardo,

    Essa situação é muito simples é só vc fazer um bind do datacontext do seu form com o item selecionado do datagrid.

    Seguem dois link de como trabalhar com o datagrid do WPF:

    http://www.linhadecodigo.com.br/Artigo.aspx?id=2163

    http://www.macoratti.net/10/03/wpf_dtg1.htm

    E para pegar a linha selecionada do datagrid é só fazer datagrid.CurrentRow

     

    • Sugerido como Resposta Thiago MDTech sábado, 10 de abril de 2010 04:02
    sábado, 10 de abril de 2010 04:01
  • Se você está usando o SelectedItem da Datagrid e o ItemsSource tem uma coleção do tipo que você quer, o SelectedItem é um elemento do tipo correto.

    Por exemplo, se você tem uma lista de Clientes:

    public class Cliente
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public string Endereco { get; set; }
    
        public static ObservableCollection<Cliente> GetClientes()
        {
            var lista = new ObservableCollection<Cliente>();
            for (int i = 0; i < 100; i++)
            {
                lista.Add(new Cliente
                              {
                                  Codigo = i + 1, 
                                  Nome = "Nome " + (i + 1), 
                                  Endereco = "Endereco " + (i + 1)
                              });
            }
            return lista;
        }
    }
    

    E faz a propriedade ItemSource igual à lista de clientes:

    dg.ItemsSource =

    Cliente.GetClientes();

     

    Você pode pegar o item selecionado no evento MouseDoubleClick da grid. Este item é um objeto do tipo cliente:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var wnd = new Window2();
        wnd.DataContext = dg.SelectedItem;
        wnd.ShowDialog();
    }
    

    A janela Window2 irá conter as informações do cliente selecionado:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="35" />
            <RowDefinition Height="35" />
            <RowDefinition Height="35" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBox Text="{Binding Codigo}" Margin="5"/>
        <TextBox Text="{Binding Nome}" Margin="5" Grid.Row="1"/>
        <TextBox Text="{Binding Endereco}" Margin="5" Grid.Row="2"/>
    </Grid>
    

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    sábado, 10 de abril de 2010 11:20
  • No Exemplo que você me mostrou seria no caso do formulario de Carro ainda não estivesse aberto, no meu caso o problema é o seguinte, estou preenchendo o formulario, ae tem uma opcao, cor do carro, ae o usuario vai clicar no botao Mostrar Cor do Carro, ae vai aparecer outro formulario com as cores na DataGrid, vai clicar duas vezes na cor desejada, automaticamento o form de cor vai fechar, e o usuario vai continuar a preencher o formulario...

    o problema que nao consigo fazer a cor aparece no textbox sem fechar o formulario de Carros, mas se fecho os formulario de Carros os outros dados do form Carro vao pro espaco...

     

    Tem com me Ajudar?

    segunda-feira, 12 de abril de 2010 11:48
  • No Exemplo que você me mostrou seria no caso do formulario de Carro ainda não estivesse aberto, no meu caso o problema é o seguinte, estou preenchendo o formulario, ae tem uma opcao, cor do carro, ae o usuario vai clicar no botao Mostrar Cor do Carro, ae vai aparecer outro formulario com as cores na DataGrid, vai clicar duas vezes na cor desejada, automaticamento o form de cor vai fechar, e o usuario vai continuar a preencher o formulario...

    o problema que nao consigo fazer a cor aparece no textbox sem fechar o formulario de Carros, mas se fecho os formulario de Carros os outros dados do form Carro vao pro espaco...

     

    Tem com me Ajudar?

    segunda-feira, 12 de abril de 2010 11:56
  • Neste caso, é muito mais simples:

    Crie uma propriedade CorDoCarro na Form de cores:

    public string CorDoCarro { get; private set; }

    No evento MouseDoubleClick da DataGrid da Form de Cores, coloque:

     

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = dg.SelectedItem;
      DialogResult = DialogResult.OK;

    }

    No código do botão onde chama a Form, faça algo como:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var wnd = new Window2();
        if (wnd.ShowDialog() == true)
          textBox1.Text = wnd.CorDoCarro;
    }

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    segunda-feira, 12 de abril de 2010 13:48
  • Vamos la... está quase dando certo, porém nao estou entendo umas coisas....

    coloquei no formulario de Cores a declaracao

    public string CorDoCarro { get; private set; }

    e também

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = dg.SelectedItem;
      DialogResult = DialogResult.OK;

    }

    porém a propriedade DialogResult.OK nao existe e também tive que colocar CorDoCarro = dg.SelectedItem.ToString();

    ae fiz assim

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = dg.SelectedItem.ToString();
      DialogResult = false;

    }

    no form que chama o form que tem a grid com as cores fiz assim

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var wnd = new Window2();
        if (wnd.ShowDialog() == false)
          textBox1.Text = wnd.CorDoCarro;
    }

    Isso, agora pelo menos consegui preencher o textbox com alguma coisa, mas o dado nao veio corretamente, veio com o nome da tabela TbCores...

    O que está fazendo, e porque não está dando certo?

    segunda-feira, 12 de abril de 2010 18:30
  • Se você preenche as cores com dados de uma tabela, cada item é uma linha da tabela. O que você precisa é pegar o campo correto no evento DoubleClick:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = ((CoresCarros)dg.SelectedItem).Cor;
      DialogResult = false;

    }

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    segunda-feira, 12 de abril de 2010 22:17
  • para aparecer as cores na datagrid eu uso o seguinte comando

    minha tabela tb_cores tem o campo codigo onde fica a cor do carro, amarelo azul, prata, preto, etc

    private

     

    void Window_Loaded(object sender, RoutedEventArgs e)

    {

     

    BDDataDataContext conn = new BDDataDataContext();

     

    List<tb_cores> tbCores = (from s in conn.tb_cores select s).ToList();

    dataGrid1.ItemsSource = tbCores;

    }

     

     

     

    <my:DataGrid AutoGenerateColumns="False" Name="dataGrid1" Height="217" VerticalAlignment="Top" MouseDoubleClick="dataGrid1_MouseDoubleClick">

     

     

    <my:DataGrid.Columns>

     

     

    <my:DataGridTextColumn Header="Cor" Binding="{Binding Path = codigo}" Width="100" CanUserResize="False" CanUserSort="False" CanUserReorder="False" />

     

     

    </my:DataGrid.Columns>

     

     

    </my:DataGrid>

     

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = ((codigo)dg.SelectedItem).ToString();
      DialogResult = false;

    }

     

    Porém a um erro

    Error 1 The type or namespace name 'codigo' could not be found (are you missing a using directive or an assembly reference?) 

     

    parece que ele nao esta achando o campo na grid, é assim mesmo?

     

    segunda-feira, 12 de abril de 2010 23:57
  • Segundo o que você colocou, os itens da DataGrid são do tipo tb_cores.

    O código que você deve colocar é:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {

      CorDoCarro = ((tb_cores)dg.SelectedItem).codigo;
      DialogResult = false;

    }

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Ricardo Duk terça-feira, 13 de abril de 2010 12:24
    terça-feira, 13 de abril de 2010 10:25