none
WPF - Preencher textbox ao clicar no datagrid mas não o inverso RRS feed

  • Pergunta

  • Bom dia.

    Estou começando a desenvolver em C# usando wpf.

    Estou precisando preencher os textbox quando clicar no datagrid. Até ai tranquilo, mas eu não quero que o inverso ocorra, ou seja, quando eu editar o textbox, alterar o datagrid.

    Segue abaixo meu Código.

    <TextBox Text="{Binding  SelectedItem.CodSistema, ElementName=dtgCadastro, UpdateSourceTrigger=PropertyChanged}" Name="txtCodigo" />
    
    <DataGrid Name="dtgCadastro" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Código" Binding="{Binding Path=CodSistema}" />
        </DataGrid.Columns>
    </DataGrid>

    Tentei colocar no textbox o mode mas não deu certo.

    Alguem sabe onde estou errando?

    Obrigado

    terça-feira, 20 de agosto de 2013 13:42

Respostas

  • Cara eu não sei o que mais te falar. Não temos todo o código que vc fez. 

    Eu sugiro vc criar um novo projeto e colocar essa parte do DataGrid e TextBox parecida com o seu projeto real, e ver o que está acontecendo. Normalmente, quando se faz isso, vc descobre oq está de errado. Aproveita e sobe para o skydrive para nós darmos uma olhada.


    Take a look at WPF FlashMessage
    About.me

    • Marcado como Resposta Rafael Terada terça-feira, 12 de novembro de 2013 10:45
    sexta-feira, 30 de agosto de 2013 13:34

Todas as Respostas

  • Tentou o OneWay binding?

    <TextBox Text="{Binding  SelectedItem.CodSistema, ElementName=dtgCadastro, Mode=OneWay}" Name="txtCodigo" />

    E não tenho certeza se precisa do UpdateSourceTrigger, acho que não é necessário.


    Take a look at WPF FlashMessage
    About.me

    segunda-feira, 26 de agosto de 2013 12:52
  • Bom dia. Tentei o OneWay, mas ele fica o inverso do que eu quero.

    Quando eu altero o textbox ele altera o grid. Eu queria na verdade que quando alterasse o grid, alterasse o textbox.

    Será que tem como eu fazer um bind com oneway no grid?

    Obrigado

    terça-feira, 27 de agosto de 2013 12:15
  • Sim, você deve usar nesse caso o modo OneWayToSource. Ele é exatamente o que você quer, o inverso.

    Take a look at WPF FlashMessage
    About.me

    terça-feira, 27 de agosto de 2013 12:56
  • Eu tentei usar o OneWayToSource, mas quando eu altero o grid, não acontece nada.

    Tem algum codigo a mais quando usa o OneWayToSource?

    Obrigado

    terça-feira, 27 de agosto de 2013 13:22
  • Olha, eu fiz um teste aqui e funcionou com o OneWay binding:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525"
            Loaded="Window_Loaded">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            
            <TextBox Grid.Row="0" Text="{Binding SelectedItem.Codigo, ElementName=dgvDados, Mode=OneWay}"/>
            <DataGrid Grid.Row="1" Name="dgvDados" ItemsSource="{Binding Itens, RelativeSource={RelativeSource AncestorType=Window}}"/>
        </Grid>
    </Window>
    

    using System.Collections.ObjectModel;
    using System.Windows;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                Itens = new ObservableCollection<Pessoa>();
            }
    
            public ObservableCollection<Pessoa> Itens { get; set; }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                Itens.Add(new Pessoa { Codigo = 10, Nome = "Joba" });
                Itens.Add(new Pessoa { Codigo = 99, Nome = "Outro" });
            }
        }
    }
    

    namespace WpfApplication1
    {
        public class Pessoa
        {
            public int Codigo { get; set; }
            public string Nome { get; set; }
        }
    }
    


    Take a look at WPF FlashMessage
    About.me

    • Sugerido como Resposta Joba Diniz terça-feira, 27 de agosto de 2013 21:34
    terça-feira, 27 de agosto de 2013 13:36
  • Boa tarde. Não consegui.

    Meu codigo:

    <UserControl x:Class="Seg.Form.UCSistema"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="454" d:DesignWidth="914" >
        <Grid Width="Auto" Height="Auto" Name="GridSistema">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>        
            
    <TextBox Height="23" Text="{Binding SelectedItem.CodSistema, ElementName=dtgCadastro, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
    HorizontalAlignment="Left" Margin="6,24,0,0" Name="txtCodigo" VerticalAlignment="Top" Width="71" TextChanged="txtCodigo_TextChanged" />
    <TextBox Height="23" Text="{Binding SelectedItem.Nome, ElementName=dtgCadastro, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
                                 HorizontalAlignment="Left" Margin="104,24,0,0" Name="txtNome" VerticalAlignment="Top" Width="343" />
                        
                        <DataGrid AutoGenerateColumns="False" Grid.Row="3" AlternationCount="2" RowBackground="Beige" AlternatingRowBackground="LightBlue" Height="242" HorizontalAlignment="Left" Margin="6,5,0,0" Name="dtgCadastro" VerticalAlignment="Top" Width="564" IsReadOnly="True" >
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Código" Binding="{Binding Path=CodSistema}" Width="100" />
                                <DataGridTextColumn Header="Nome" Binding="{Binding Path=Nome}" Width="*" />
                            </DataGrid.Columns>
                        </DataGrid>                        
        </Grid>
    </UserControl>

    E eu preencho o grid da seguite maneira

    dtgCadastro.ItemsSource = _dao.PorCodigo(txtCodigo.Text.Trim(), session);

    Onde _dao.PorCodigo retorna uma IList<Sistema>.

    Já testei o Mode OneWay e OneWayToSource

    Onde estou errando.

    Obrigado



    terça-feira, 27 de agosto de 2013 18:31
  • Esse UpdateSourceTrigger não é necessario pelos meus testes.

    O que você pode testar é usar o ObservableCollection, mas acho que não é isso:

    dtgCadastro.ItemsSource = new ObservableCollection<Sistema>( _dao.PorCodigo(txtCodigo.Text.Trim(), session));

    E em qual momento o código acima é executado?


    Take a look at WPF FlashMessage
    About.me

    terça-feira, 27 de agosto de 2013 19:37
  • Mode=TwoWay no binding do TextBox, dessa forma se você mudar o TextBox.Text vai alterar o SelectItem e caso o SelectItem seja alterado, vai alterar na caixa de texto.
    terça-feira, 27 de agosto de 2013 20:30
  • Boa tarde. Eu executo esse codigo no click de um botão.

    O codigo com ObservableCollection não aletrou em nada.

    Obrigado

    quarta-feira, 28 de agosto de 2013 17:27
  • Boa tarde.

    Mas eu não quero que quando eu alterar o texto do textbox, ele altere o grid

    Obrigado

    quarta-feira, 28 de agosto de 2013 17:28
  • E você implementou a interface INotifyPropertyChanged na sua classe que está dentro da ObservableCollection?

    http://msdn.microsoft.com/pt-BR/library/system.componentmodel.inotifypropertychanged.aspx

    quarta-feira, 28 de agosto de 2013 17:34
  • Não precisa implementar o INotifyPropertyChanged nesse caso.

    Rkrterada, o exemplo que dei funciona perfeitamente do jeito que você quer. Pegue o exemplo e veja ele rodando.

    A propriedade Codigo da classe Sistema é public int Codigo {get;set;} ?? ou é só get;?


    Take a look at WPF FlashMessage
    About.me

    quarta-feira, 28 de agosto de 2013 18:10
  • Bom dia, desculpa a demora.

    A propriedade é set e get.

    Fiz conforme vc me falou mas não deu certo. Se eu não colocar dtgCadastro.ItemsSource = Itens; ele não preenche o grid. Está certo?

    E quando eu coloco e preenche, ele não seta o textbox com a opcao Mode=OneWay.

    Obrigado

    sexta-feira, 30 de agosto de 2013 13:27
  • Cara eu não sei o que mais te falar. Não temos todo o código que vc fez. 

    Eu sugiro vc criar um novo projeto e colocar essa parte do DataGrid e TextBox parecida com o seu projeto real, e ver o que está acontecendo. Normalmente, quando se faz isso, vc descobre oq está de errado. Aproveita e sobe para o skydrive para nós darmos uma olhada.


    Take a look at WPF FlashMessage
    About.me

    • Marcado como Resposta Rafael Terada terça-feira, 12 de novembro de 2013 10:45
    sexta-feira, 30 de agosto de 2013 13:34
  • Blz, vou tentar aqui.

    Se não conseguir eu coloco no skydrive.

    Obrigado

    sexta-feira, 30 de agosto de 2013 13:49