none
Como inserir uma linha vazia no ComboBox do WPF ? RRS feed

  • Pergunta

  • Olá a todos!

    Procurei muito na net e não consigo uma solução. Gostaria de colocar no ComboBox uma linha vazia junto com as demais linhas para que não fique selecionado uma fixa e o usuário tenha a opção de deixar o ComboBox vazio.

    Alguém sabe como?

    Este é meu ComboBox:

    <ComboBox Name="cmbTipo" 
      SelectedValuePath="Id" 
      DisplayMemberPath="Descricao" 
      Grid.Column="1" 
      Grid.Row="1" 
      Height="30" 
      HorizontalAlignment="Left" 
      Margin="317,39,0,0" 
      VerticalAlignment="Top" 
      Width="387">
    </ComboBox>
    

    E assim eu insiro dados nele:

    this.cmbTipo.ItemsSource = ((IListSource)dataTable).GetList();
    
    Alguém pode me ajudar?
    terça-feira, 8 de fevereiro de 2011 17:37

Respostas

  • Tiago,

    Você pode utilizar o método Insert da sua List<T> para inserir um item vazio na posição zero:

    List<Pessoa> source = new List<Pessoa>();
    
    source.Add(new Pessoa()
    {
      Nome = "André",
      Sobrenome = "Lima"
    });
    source.Add(new Pessoa()
    {
      Nome = "Fulano",
      Sobrenome = "de Tal"
    });
    
    source.Insert(0, new Pessoa());
    meuCombobox.ItemsSource = source;
    meuCombobox.DisplayMemberPath = "Nome";
    meuCombobox.SelectedValuePath = "Codigo";
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 15 de fevereiro de 2011 16:12
    Moderador
  • Andre, funcionou bem também!

    Eu já tinha descoberto essa mesma artimanha com DataTable ao invés de List. Neste caso ficou assim.

        public static IList PreencherComboBox(DataTable dt)
        {
          DataRow dr = dt.NewRow();
    
          try
          {
            // Define a linha vazia 
            dr[0] = 0;
            dr[1] = String.Empty;
    
            // Insere a linha vazia no DataTable 
            dt.Rows.InsertAt(dr, 0);
    
            return ((IListSource)dt).GetList();
          }
          catch (Exception e)
          {
            TratamentoError(e);
          }
          finally
          {
            dr = null;
          }
    
          return null;
        }
    segunda-feira, 21 de fevereiro de 2011 11:47

Todas as Respostas

  • Ola Tiago

    insira um ComboBoxitem vazio 

       <ComboBoxItem Content=""/>

     

     <ComboBox Name="cmbTipo"
      SelectedValuePath="Id"
      DisplayMemberPath="Descricao"
      Height="30"
      HorizontalAlignment="Left"
      Margin="317,39,0,0"
      VerticalAlignment="Top"
      Width="213.333" d:LayoutOverrides="GridBox">
      
       <ComboBoxItem Content=""/>
      
      </ComboBox>

    te mais

     

     

    quarta-feira, 9 de fevereiro de 2011 10:04
  • Rafael, obrigado por responder.

    Ao colocar o ComboBoxItem vazio, a aplicação passou a exibir o seguinte erro: "Items collection must be empty before using ItemsSource."

    E o ComboBox não esta mais sendo alimentado. Este mesmo erro ocorre usando a propriedade: "d:LayoutOverrides="GridBox" e não usando ela.

    Acho que o WPF não permite inserir dados no ComboBox de duas formas ao mesmo tempo.

    O meu ComboBox ficou assim:

    <ComboBox Name="cmbTipo" 
      SelectedValuePath="Id" 
      DisplayMemberPath="Descricao" 
      Grid.Column="1" 
      Grid.Row="1" 
      Height="30" 
      HorizontalAlignment="Left" 
      Margin="317,39,0,0" 
      VerticalAlignment="Top" 
      Width="387">
    
      <ComboBoxItem Content=""/>
    </ComboBox>
    

    Tem alguma outra ideia?

    Att.

    quarta-feira, 9 de fevereiro de 2011 11:35
  • Tente inserir um item na sua lista
     só que com o texto em branco

    elimine o que postei pois vc tem razao nao tem como
    inserir dados no ComboBox de duas formas ao mesmo tempo

     

    quarta-feira, 9 de fevereiro de 2011 13:14
  • abraço
    quarta-feira, 9 de fevereiro de 2011 13:14
  • O problema de colocar um item vazio é que eu terei que criar um novo DataTable ou List<> (caso seja uma coleção de objetos), no novo DataTable ou List colocarei o item vazio e então percorrendo o DataTable/List original (foreach) adicionar os seus itens no novo DataTable/List.

    Isso vai afetar a performace, a menos que tenha um jeito de inserir uma DataRow vazia no inicio do DataTable ou um Objeto vazio no inicio de uma List.

    Sabe me dizer se tem como fazer isso? Se eu simplesmente adicionar a nova DataRow ou Objeto eles ficam no final.

     

    Att.

    quarta-feira, 9 de fevereiro de 2011 13:42
  • Tiago,

    Você pode utilizar o método Insert da sua List<T> para inserir um item vazio na posição zero:

    List<Pessoa> source = new List<Pessoa>();
    
    source.Add(new Pessoa()
    {
      Nome = "André",
      Sobrenome = "Lima"
    });
    source.Add(new Pessoa()
    {
      Nome = "Fulano",
      Sobrenome = "de Tal"
    });
    
    source.Insert(0, new Pessoa());
    meuCombobox.ItemsSource = source;
    meuCombobox.DisplayMemberPath = "Nome";
    meuCombobox.SelectedValuePath = "Codigo";
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 15 de fevereiro de 2011 16:12
    Moderador
  • Andre, funcionou bem também!

    Eu já tinha descoberto essa mesma artimanha com DataTable ao invés de List. Neste caso ficou assim.

        public static IList PreencherComboBox(DataTable dt)
        {
          DataRow dr = dt.NewRow();
    
          try
          {
            // Define a linha vazia 
            dr[0] = 0;
            dr[1] = String.Empty;
    
            // Insere a linha vazia no DataTable 
            dt.Rows.InsertAt(dr, 0);
    
            return ((IListSource)dt).GetList();
          }
          catch (Exception e)
          {
            TratamentoError(e);
          }
          finally
          {
            dr = null;
          }
    
          return null;
        }
    segunda-feira, 21 de fevereiro de 2011 11:47