none
AJUDA / HELP - ME RRS feed

  • Pergunta

  • ja procurei no google e nao encontrei nada a haver que eu estou procurando

    na primeira imagem, eu queria saber o codigo pra fazer o textbox virar uma caixa de pesquisar todas as coisas contidas no listbox

    IMAGEM 1: https://img15.hostingpics.net/pics/944359myps8.png

    esta outra imagem se referi-se ao listbox quando click no texto contido no listbox abri uma imagem, eu queria criar uma pasta especifica para o programa e uma subpasta para colocar as imagens sem precisar ficar usando o meu pc pra procurar asimagens

    IMAGEM 2: https://img15.hostingpics.net/pics/859638myps88.png

    segunda-feira, 29 de maio de 2017 18:49

Respostas

  • Pois bem, vamos por partes. O que você está precisando nos eu programa é um: Sistema de Filtragem de dados, de maneira que você use o conteúdo do TextBox para fazer uma pesquisa em certo lugar; e também, um sistema de "referencias" (OK, isso soa meio estranho), que abra uma imagem quando o usuário clicar em certo item na ListBox.

    Muito fácil na verdade. Vamos começar pela Filtragem dos Dados: No C#, nós usamos os métodos de extensão do namespace Linq, que só prove alguns métodos de extensão para a interface IEnumerable<>, que é implementada por todas as Coleções no C#.

    Veja um exemplo bem simples de filtragem com os métodos de extensão do Linq:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> persons = new List<Person>();
            // Preencha a lista com alguns dados...
    
            // Filtragem 1: Usando o método Where
            IEnumerable<Person> filteredPersons = persons.Where(x => x.Age > 18);
    
            foreach (Person p in filteredPersons)
            {
                Console.WriteLine($"The person {p.Name} is of legal age");
            }
        }
    }

    No exemplo acima, uma filtragem básica usando o método Where() com uma Expressão Lambda. O que esse código faz é simples mente pegar todas as Persons na List<> que tenham a propriedade Age maior que 18.

    Se você fosse usar esse código no seu programa, ficaria mais ou menos assim:

    private void FilterItems()
    {
        var itens = listBox1.Items.Cast<string>();
        var filteredItems = itens.Where(x => x == textBox1.Text);
    
        foreach (var item in filteredItems)
        {
            MessageBox.Show(item);
        }
    }

    Nesse exemplo, nós fazemos um Cast, para converter o tipo dos itens na ListBox, porque o tipo deles é ListBox.ObjectCollection, mas só precisamos do texto deles. Depois, fazemos uma filtragem em todas essas strings dos itens na ListBox, e pegamos só os itens que forem iguais ao texto na TextBox.

    A filtragem já está feita (evidente que você pode incrementar ela, usando uma expressão regular ou fazendo mais filtragens), agora o que falta é abrir a imagem associada ao item na lista. Confesso que essa parte é difícil pra mim te mostrar, por que eu não sei como é que você está colocando esses itens na lista, mas vamos supor que você conheça a origem dos items; Você pode fazer um Dictionary<> contendo o caminho de cada imagem, e o texto associado a essa imagem, para abri-lá. Veja mais um exemplo:

    private Dictionary<string, string> images = new Dictionary<string, string>();
    
    images.Add("car", @"C:\test\car.png");
    images.Add("flower", @"C:\test\flower.png");
    images.Add("gun", @"C:\test\gun.png");

    No código acima, temos um Dictionary<string, string>, onde as Keys são as palavras/texts que vão estar na sua ListBox. Os valores são os caminhos das imagens no sistema.

    Agora, para unir tudo isso, veja como fazemos:

    Dictionary<string, string> images = new Dictionary<string, string>();
    
    public Form1()
    {
        InitializeComponent();
    }
    
    private void FilterItems(object sender, EventArgs e)
    {
        IEnumerable<string> itens = listBox1.Items.Cast<string>();
        IEnumerable<string> filteredItems = itens.Where(x => x == textBox1.Text);
    
        listBox1.Items.Clear();
    
        foreach (string item in filteredItems)
        {
            listBox1.Items.Add(item);
        }
    }
    
    private void OpenImage(object sender, EventArgs e)
    {
        IEnumerable<KeyValuePair<string, string>> path = images.Where(x => x.Key == listBox1.Items[listBox1.SelectedIndex].ToString());
    
        if (path != null && path.Count() > 0)
        {
            foreach (KeyValuePair<string, string> item in path)
            {
                try
                {
                    Process.Start(item.Value);
                }
                catch (Exception)
                {
                    MessageBox.Show("Image not found");
                }
    
                break;
            }
        }
    }

    Deixa eu te explicar o que fizemos. A filtragem básica nos itens da lista, mostrando só os que forem iguais ao Text da TextBox, depois, no método OpenImage(), que pode ser chamado pelo evento Click de algum botão, nós novamente filtramos todos os elementos da ListBox, e pegamos só o que tiver um texto associado ao Dictionary<> images. Se texto do item selecionado na ListBox for igual ao Key do Dictionary, então, pegamos o Value associado a esse Key e tentamos abrir o processo com o Process.Start().

    No exemplo que te passei, o value de cada item no Dictionary<> é suposto para ser o texto que o item da ListBox terá, já o Value é o caminho da imagem para ser aberta.

    Veja se te ajuda.


    terça-feira, 30 de maio de 2017 15:15