[C#] proste operacje na listbox

0

Wyczytałem już jak dodać i usunąć coś z listy...
Mam tylko jeden problem. Chciałem dodać opcje, która sprawdzałaby czy wyraz wpisany w textbox znajduje się na liście. Pomyślałem, że wykorzystam funkcje Contains(), niestety jak już wiem nie można podać stringa jako argumentu....

if (textBox1.Text != "")
    {
        if (listBox1.Contains())
        {
              istBox1.Items.Remove(textBox1.Text);
              textBox1.Text = "";
        }
        else
        {
              MessageBox.Show("Nie ma takiego produktu", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    } 
0

Nie sprawdzaj czy ListBox coś zawiera, tylko czy ListBox.Items coś zawiera, o tak:

if (this.listBox1.Items.Contains(this.textBox1.Text))
{
    this.listBox1.Items.Remove(this.textBox1.Text);
    this.textBox1.Text = "";
}
else
{
    MessageBox.Show("Nie ma takiego produktu", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
0

Dzięki za wcześniejszą odpowiedź, ale wróciłem z kolejnym pytaniem...
Zrobiłem sobie zapis i wczytywanie z pliku tekstowego do ListBox. Problem jest z wczytywaniem, ponieważ wczytuje mi pusty element jako pierwszy na liście. Sprawdzałem czy czasem pod indeksem 0 nie kryje się pusty string, ale niestety nie...
Plik tekstowy wygląda tak : masło#ser#pomidory#ziemniaki#

 
private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            StreamReader wczytaj = new StreamReader(adres);
            string zmienna = ""; 
            zmienna = wczytaj.ReadLine();

            string[] tab = zmienna.Split('#');
            for (int i = 0; i < tab.Length; i++)
            {
                listBox1.Items.Add(tab[i]);
            }
            wczytaj.Close();
        }
0

Taka uwaga na boku - zasób należy zwalniać najszybciej po jego użyciu. W pętli for już nie używasz pliku, więc wczytaj.Close() należałoby wykonać przedtem.
Ponadto często lepiej jest użyć using, bo zapewnia się w ten sposób, że plik zostanie zamknięty zawsze, nawet w przypadku jakiegoś błędu podczas odczytu, o tak:

string zmienna = string.Empty;
using (StreamReader wczytaj = new StreamReader())
{
    zmienna = wczytaj.ReadLine();
}

Można też pliki odczytywać znacznie prościej, przy użyciu metod statycznych z klasy File, np.:

string zmienna = File.ReadAllText(adres);

Natomiast Twój błąd może być spowodowany chyba wyłącznie tym, że pierwszym znakiem Twojego pliku jest '#'. Możesz się pozbyć pustych wpisów nakazując metodzie Split ich usunięcie, np. w ten sposób:

string[] tab = zmienna.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
0

Z czasem "ulepszania" programiku rodzą mi się nowe pytania. Teraz problem jest taki. Chce pytać użytkownika przy wyłączaniu, czy zapisać zmiany. Haczyk jest jeden, nie wiem jaki warunek postawić, aby program nie pytał się, gdy nie dokonano żadnych zmian na ListBox. Próbowałem kopiować zawartość listy do stringa na początku i na końcu programu, a następnie je porównywać... nie wypaliło.

 
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(  ???   )
              {
                  if (MessageBox.Show("Chcesz zapisać zmiany?", "Zapis", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                  {

                  }
              }
        }

...i jeszcze coś. Instrukcje od zapisu mam wrzucone pod prywatną funkcję kliknięcia przycisku zapisz. Pytanie, czy można odwołać się do tego w FormClosing ?

 
private void button1_Click(object sender, EventArgs e)
        {
            string tresc = "";
            foreach (string element in listBox1.Items)
            {
                tresc += element + "#";
            }
            try
            {
                using (StreamWriter zapis = new StreamWriter(adres))
                {
                    zapis.Write(tresc);
                    zapis.Close();
                }
                MessageBox.Show("Zapisywanie powiodło się", "Zapis", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("Zapisywanie nie powidło się!", "Zapis", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
0

Ad 1) Ja zrobił bym sobie w klasie pole typu bool o nazwie np. wasDataChanged, które zmieniłbym na true w sytuacji gdy coś na ListBoxie się zmieni. A później pytałbym w zależności od wartości tego pola.

Ad 2) Można tak:

this.button1.PerformClick()

Można też tak:

this.button1_Click(this.button1, EventArgs.Empty)

Ale najlepiej byłoby wydzielić ten kod do oddzielnej metody i wywoływać ją raz w Button.Click, a raz w From.Closing.

P.S. Używając strumienia w using nie musisz wywoływać metody Close(), bo using zrobi to za Ciebie. (Tak czy siak do małych plików polecam używanie metod z klasy File zamiast zabawy w strumienie.)

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