Wyświetlanie a nie dodawanie do listy

0

Witam wszystkich:)

Mam następujący problem zapisuje dane do listy, następnie chce wyszukać określony ciąg znaków w liście i tylko te elementy wyświetlić.
Wszystko fajnie tylko nie wiem jak wyświetlić elementy w liście te które mi się podobają a nie je ponownie dodać.
Robię to tak:
dodaje dane do listy i je wyświetlam,
użytkownik podaje słowo w kontrolce
zapisuję do zmiennej 'warto_art' słowo które żąda użytkownik
następnie przez pętlę sprawdzam gdzie w liście występuje to słowo:

foreach (var tomato in probbb)
                {
                    for (int i = 0; i < tomato.ShortName2.Count; i++)
                    {
                      string artykul_tym = tomato.FullName2[i].ToString();
                      if (0 < artykul_tym.IndexOf(warto_art))                        // jeżeli IndexOf jest prawdą to znaczy występuje szukane słowo to...
                      {
                           checkedListBox2.Items.Add(tomato.FullName2[i].ToString()); // i tu jest problem teraz dodaje mi ponownie elementy do listy 
                                                                                                             // a ja chcę by pokazał tylko te elementy które mi odpowiadają 
                                                                                                             // a nie na nowo je dodawał
                            
                      }
              
                    }

Nie wiem czy coś takiego jest możliwe, ale proszę o jakąś podpowiedź jak rozwiązać ten problem. Dzięki:)

0

To czemu dajesz Add? I co masz na myśli mówiąc "pokazał"?

0

chodzi o to żeby nie zmieniać zawartości listy tylko tymczasowo pokazać niektóre jej elementy (te które są zgodne z szukanym słowem)

0

Rozumiem, że checkedListBox2 to jest jakaś kontrolka, i w niej chcesz wyświetlić tylko niektóre elementy, te, które spełniają warunek.

Najlepiej, jak będziesz utrzymywać wszystkie elementy w osobnej strukturze, np List<string>, a przy wyświetlaniu, to przed pętlą zrobisz checkedListBox2.Clear(), a w pętli po List<string> dodasz elementy za pomocą checkedListBox2.Add() tylko te, które spełniają narzucony przez Ciebie warunek.

0

Jak pokazać? Wyświetlić MessageBoxie? W label? Podświetlić item w Listboxie? Co to jest probb?

0

andrzejlisek - tak właśnie robię jak mówisz tylko jest pewien problem gdy użytkownik zaznacza pozycje w checkedListBox2 (takim ptaszkiem, np. jeden artykuł, później drugi itd.) a następnie szuka innego artykułu i go też chce zaznaczyć to tamte wcześniejsze się odznaczają by było użyte checkedListBox2.Add() i nie wiem co z tym zrobić?

0

Przechowaj w jakiejś liście indeksy zaznaczonych checkboxów, po dodaniu nowego zaznacz je z powrotem. Chyba tak najprościej.

0
dam1an napisał(a):

Jak pokazać? Wyświetlić MessageBoxie? W label? Podświetlić item w Listboxie? Co to jest probb?

koleś po prostu chce zrobić filtrowanie w listboxie - chce żeby itemy się filtrowały podczas wpisywania fragmentu tekstu do textboxa

0

ok, spróbuje, dodaniem nowych chyba nie będzie problemu trudniej będzie jeżeli użytkownik postanowi co niektóre odznaczyć, zobaczę dzięki

0

xxxvbsadg - zgadza się jakieś pomysły z tym filtrowaniem, jak to zrobić?

0

nie robiłem niczego takiego w czystym winforms - w wpf to nie jest problem, na customowych kontrolkach z devexpress też nie

pobierz sobie najlepiej gotową kontrolkę to umożliwiającą - na pewno ktoś taką napisał
jeśli nie to moja propozycja - przechowuj listę obiektów osobno, listbox traktuj tylko jako widok który będziesz uzupełniał danymi z listy na podstawie kryteriów w textboksie

do Items możesz przekazywać cały obiekt - obiekt będzie wyświetlany tak jak wpiszesz w przeciążonej metodzie "ToString()" - w tym samym obiekcie możesz zapisywać info o jego zaznaczeniu - zaznaczenie możesz przywracać podczas dodawania elementu do listboxa (po filtrowaniu), i zapisywać do encji podczas zaznaczania w listboxie

0

na szybko (bo sam chciałem przetestować czy umiałbym to zrobić w czystym winforms):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private List<Obiekt> obiekty = new List<Obiekt>
        {
                new Obiekt { zaznaczony = CheckState.Checked, tekst = "a" },
                new Obiekt { zaznaczony = CheckState.Unchecked, tekst = "b" },
                new Obiekt { zaznaczony = CheckState.Checked, tekst = "c" }
        };

        private class Obiekt
        {
            public CheckState zaznaczony;
            public string tekst;

            public override String ToString() {
                return tekst;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.TextChanged += textBox1_TextChanged;
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
            refilter("");
        }

        void textBox1_TextChanged(object sender, EventArgs e)
        {
            refilter(textBox1.Text);
        }

        void refilter(String start)
        {
            checkedListBox1.Items.Clear();
            foreach (Obiekt o in obiekty.Where(x => x.tekst.StartsWith(start)))
            {
                checkedListBox1.Items.Add(o, o.zaznaczony);
            }
        }

        void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            ((sender as CheckedListBox).Items[e.Index] as Obiekt).zaznaczony = e.NewValue;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Zaznaczono: \n" + string.Join("\n", obiekty.Where(x => x.zaznaczony == CheckState.Checked).Select(x => x.tekst).ToArray()));
        }
    }
}
0

Super dzięki, zaraz sprawdzę:)

0

Czy ktoś może mi powiedzieć w tej linijce bo nie mam zielonego pojęcia:
obiekty.Where(x => x.tekst.StartsWith(start)
i w tej:
((sender as CheckedListBox).Items[e.Index] as Obiekt).zaznaczony = e.NewValue;

czym jest ten x skąd on się wziął

0

Witam, przeczytałem już o wyrażeniach lambda ale dalej nie wiem jak działa ta linijka:
((sender as CheckedListBox).Items[e.Index] as Obiekt).zaznaczony = e.NewValue;
potrzebuję tylko informacji to robi to a to robi to. Sorry za upierdliwość ale chce to rozkminić a mam mało czasu

0

Rzutujesz obiekt sender na CheckListBox, potem pobierasz z tego item o indeksie e.Index i rzutujesz na Obiekt, następnie właściwości zaznaczony tego obiektu przypisujesz wartość e.NewValue. Rozjaśniło się? :D

0

Co przechowuje wartość 'e' - wartość Unchecked lub Checked czy coś innego, dlaczego jest to e.NewValue, proszę o cierpliwość:(

2

Uwaga minimalna znajomość angielskiego wymagana:
Co to ta klasa ItemCheckEventArgs Class
Co przechowuje e ItemCheckEventArgs Properties
Co to jest to NewValue ItemCheckEventArgs.NewValue Property
Co to jest "to" co zwraca NewValue CheckState Enumeration

I teraz po co ja na wklejałem tych linków tyle, ano warto przeczytać nawet pobieżnie ale co ważniejsze wrzucić przykłady w VS i debuggerem po kolei skakać i podglądać co tam siedzi i starać się dociec czemu tak a nie inaczej.

I z każdym problem najlepiej udać się na starcie do msdn'a zwykle wszystko jest dobrze opisane wraz z przykładami. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1