Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Porównanie textboxa z pozycjami listboxa.


Rekomendowane odpowiedzi

Opublikowano

Za pierwszym razem działa, ale gdy program próbuje powtórzyć kod dostaje błąd 

 

System.InvalidOperationException: List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change.
   at System.Windows.Forms.ListBox.ItemArray.EntryEnumerator.System.Collections.IEnumerator.MoveNext()
   at Vlauncher.Form1.Button6x_Click(Object sender, EventArgs e) in C:\Users\Crossik\Documents\Visual Studio 2013\Projects\Vlauncher\Vlauncher\Form1-kopia.vb:line 311
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

  For Each item In ListBox1.Items
            If TextBox8x.Text + "~" + TextBox7x.Text = item.ToString Then
                MsgBox("Ta nazwa jest już zajęta")
            Else
                ListBox1.Items.Add(TextBox8x.Text + "~" + TextBox7x.Text)
                Dim FILE_NAME As String = My.Application.Info.DirectoryPath + "\serwery.txt"
                Dim objWriter As New System.IO.StreamWriter(FILE_NAME, True)
                objWriter.WriteLine(TextBox8x.Text + "~" + TextBox7x.Text)
                objWriter.Close()

            End If
        Next

Tak wygląda kod
Opublikowano

Ogólnie patrząc, to zrobiłeś błąd w rozumowaniu. Pętla For Each jedzie kolejno po każdym elemencie w kolekcji i wykonuje kod. Czyli w twoim kodzie dla każdego elementu, gdy If jest fałszywy wykonuje blok Else, co jest błędem, ponieważ powinien się wykonać tylko raz i wyjść z pętli. Stąd też wyskakuje błąd, bo w trakcie wykonywania pętli modyfikujesz listę. Rozwiązaniem problemu jest wyjście z pętli w Elsie, czyli dodanie linijki "Exit For".

  For Each item In ListBox1.Items
            If TextBox8x.Text + "~" + TextBox7x.Text = item.ToString Then
                MsgBox("Ta nazwa jest już zajęta")
            Else
                ListBox1.Items.Add(TextBox8x.Text + "~" + TextBox7x.Text)
                Dim FILE_NAME As String = My.Application.Info.DirectoryPath + "\serwery.txt"
                Dim objWriter As New System.IO.StreamWriter(FILE_NAME, True)
                objWriter.WriteLine(TextBox8x.Text + "~" + TextBox7x.Text)
                objWriter.Close()
                Exit For
            End If
        Next

powinno działac

Tubady aka Chopey

❱❱❱❱ [Android] CS:GO Smoke Center ❰❰❰❰

 

Nie cheatuję.
Tubady.png

Opublikowano

Teraz dzieją się dziwne rzeczy. Jeśli nazwa ta była w listobxie przed odpaleniem programu i teraz spróbuje dodać drugą pozycję o tej samej nazwie to wyskakuje komunikat o zajętej nazwie co mnie cieszy. Jeśli natomiast najpierw dodam np "abc" a potem spróbuje dodać jeszcze raz by wyskoczył komunikat to nic z tego. Pojawiają się 2 "abc"

 
Może przed każdą kolejną pętlą odświeżyć listboxa z pliku txt?
Opublikowano

Sorki, pisałem to późnym wieczorem i nie ogarniałem. :D

 

Kod buttona:

If czyNazwaJestZajeta() Then
            MsgBox("Ta nazwa jest już zajęta")
Else
            ListBox1.Items.Add(TextBox8x.Text + "~" + TextBox7x.Text)
            Dim FILE_NAME As String = My.Application.Info.DirectoryPath + "\serwery.txt"
            Dim objWriter As New System.IO.StreamWriter(FILE_NAME, True)
            objWriter.WriteLine(TextBox8x.Text + "~" + TextBox7x.Text)
            objWriter.Close()
End If

Funkcja:

Private Function czyNazwaJestZajeta() As Boolean
        For Each item In ListBox1.Items
            If TextBox8x.Text + "~" + TextBox7x.Text = item.ToString Then
                Return True
            End If
        Next
        Return False
End Function

Tubady aka Chopey

❱❱❱❱ [Android] CS:GO Smoke Center ❰❰❰❰

 

Nie cheatuję.
Tubady.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...