Split Fehler

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Split Fehler

    Ich möchte gerne eine Datenbank Abfrage mehrerer Inhalt Daten machen. Hierfür habe ich ein URL Parameter System erstellt.
    Nun frage ich das ganze ab was soweit auch ohne Probleme klappt bis es eben leer ist. Kann ich irgendwie Abfragen ob der Split leer ist ? Um dann für den bestimmten Split eine bestimmte Aktion für das Label durchzuführen ?



    VB.NET-Quellcode

    1. Dim webbrowser1 As New WebBrowser
    2. webbrowser1.Navigate("https://breadscript.de/ibis/register.php?action=read&table=" & My.Settings.linie & "&p0=" & My.Settings.h1 & "&p1=" & My.Settings.h2 & "&p2=" & My.Settings.h3 & "&p3=" & My.Settings.h4 & "&p4=" & My.Settings.h5 & "&p5=" & My.Settings.h6 & "")
    3. Do While webbrowser1.ReadyState <> WebBrowserReadyState.Complete
    4. Application.DoEvents()
    5. Loop
    6. Dim st() As String = webbrowser1.DocumentText.Split(",")
    7. Label2.Text = st(4)
    8. Label3.Text = st(3)
    9. Label4.Text = st(2)
    10. Label5.Text = st(1)
    11. Label6.Text = st(0)

    @romins Willkommen im Forum. :thumbup:
    Hast Du Dich davon überzeugt, dass im Dokument der richtige Inhalt enthalten ist?
    Warum loadest Du synchron, um dann mit .DoEvents() zu warten?
    Das ist wie wenn Du Dir eine Pizza bestellst und alle 30 Sekunden zur Tür läufst um nachzusehen, ob der Bote da ist.
    Warte darauf, dass er klingelt!
    Lade asynchron und werte im DownloadCompleted-Event das Dokument aus.
    Und
    Uch glaube nicht, dass dieses Dokument solch eine Struktur hat, ich würde da eher einen HTML-Text erwarten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Hast Du Dich davon überzeugt, dass im Dokument der richtige Inhalt enthalten ist?
    .


    Hallo und vielen dank für die Begrüßung. Im Dokument ist der Richtige Inhalt enthalten. Allerdings wenn im Parameter etwas falsch abgefragt wird, kann er den ganzen Split nicht mehr ausführen. Also möchte ich jedesmal die Splitreihenfolge abfragen und falls leer eine bestimmte action durchführen.
    @romins Splitte das Dolument und packe das Resultat in eine RichTextBox per Zuweisung als .Lines:

    VB.NET-Quellcode

    1. Dim st() As String = webbrowser1.DocumentText.Split(",")
    2. RichTextBox1.Lines = st
    und sieh Dir an, was da rauskommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die frage ist, wenn es nichts ist bekomme ich folgenden fehler


    VB.NET-Quellcode

    1. Der Index war außerhalb des Arraybereichs.


    es gibt insgesamt 5 splits. Jeder einzelne wird irgendwann leer sein

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „romins“ ()

    @romins Da hast Du nicht mein Beispiel abgearbeitet?
    Der Fehler entsteht z.B. so:

    VB.NET-Quellcode

    1. Dim st() = { "1", "2", "3" }
    2. MessageBox.Show(st(42))
    Da hilft nur eins: Wirf die Meinung weg, dass ein Code, der compiliert, auch richtig ist.
    Wirf weg die Meinung, kopieter Code müsse funktionieren.
    Erkenne: Der Fehler sitzt 30 cm vor dem Bildschirm.
    Lerne zu debuggen: vb-paradise.de/index.php/Threa…r-finden-und-beseitigen/?
    Teste jede einzelne Zeile Deines Programms!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wo das Problem ist, ist ja schon bekannt. Es wird pro klick immer ein Split ohne Inhalt. Und deswegen scheint er das ganze nicht zu erkennen.
    Auch dies hier bringt mich nicht weiter da nichts angezeigt wird. Ist auch klar weil der URL Parameter keinen Wert hat

    RodFromGermany schrieb:

    @romins Splitte das Dolument und packe das Resultat in eine RichTextBox per Zuweisung als .Lines:

    VB.NET-Quellcode

    1. Dim st() As String = webbrowser1.DocumentText.Split(",")
    2. RichTextBox1.Lines = st
    und sieh Dir an, was da rauskommt.


    hier als demo

    breadscript.de/ibis/register.p…&p1=2&p2=3&p3=4&p4=5&p5=6

    die p 0 - 6 können verändert werden und stellen id ids in auto increment da. ist p5 z.b 20 wird nix angezeigt
    Du kannst auf Inhalte eines Arrays nicht zugreifen, wenn es diese nicht gibt. Daher der Fehler. Also musst du, bevor du auf den Inhalt zugreifst prüfen, ob es diesen überhaupt gibt.

    Dazu kann man z.B. die Lenght Eigenschaft des Arrays verwenden. Hat dir ja @Morrison schon geschrieben. Warum haste dir das nicht angeschaut?

    Übrigens, die MSDN hilft immer weiter: msdn.microsoft.com/de-de/libra…ray.length(v=vs.110).aspx
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    romins schrieb:

    Ist auch klar weil der URL Parameter keinen Wert hat
    Wenn Du nix ausliest, warum bemeckerst Du, dass der Split fehlschlägt?
    Und
    Nutze die Datei-Anhangs-Funktionalität des Forums:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    ====
    Sieh Dir im Debugger den Inhalt der Variablen an, gib Strings meinetwegen in einer MessageBox aus.
    Der String, den Du da auf einem Schmuddel-Server gehostet hast, funktioniert wunderbar:

    Ich nehme mel an, dass bei der Herkunft des Strings was nicht stimmt.
    ====
    Und:
    Machst Du Option Strict On.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube man versteht mich schlecht

    Ruft doch bitte mal

    breadscript.de/ibis/register.p…p1=2&p2=3&p3=4&p4=5&p5=20

    hier wird der p5 nicht angezeigt da er nicht aufzufinden ist in der Datenbank.

    Nehmen wir nun aber

    breadscript.de/ibis/register.p…&p1=2&p2=3&p3=4&p4=5&p5=6

    zeigt er alles an. Wenn wir aber den ersten Link sogesagt verwenden gibt PHP keinen Wert für p5 aus und VB kann das ganze nicht verarbeiten

    Er kann solange Splitten wie Daten vorhanden sind. Sind die Daten aber leer geht nichts mehr egal für welchen Split

    romins schrieb:

    Ich glaube man versteht mich schlecht
    Da gibt es genau zwei Möglichkeiten:
    Wir alle hier im Forum sind zu dumm, Deine präzisen Ausführungen zu verstehen
    und
    die andere Möglichkeit.
    ====
    Klar, wenn "Bergedorf" nicht abgefragt wird, kommt es nicht an.
    Da solltest Du mit einem typisierten DataSet arbeiten, das merkt dann, dass ein erwarteter Eintrag nicht da ist.
    Du kannst doch, wie @Morrison und @mrMo bereits explizit schrieben, mit st.Length feststellen, dass da ein Element fehlt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenns "p5" nicht gibt, dann kannste damit auch nicht arbeiten...

    Dein Array hat eine bestimmte Anzahl an Elementen (z.B. 5). Diese kannst du nutzen, indem du den Index angibst

    String s = DeinArray(2)

    Wenn du nun einen Index angibst, den es nicht gibt, dann knallt es dir die OutOfRange Exception um die Ohren.

    String s = DeinArray(999)

    Also prüfe vor ab ob es das Element mit dem gewünschten Index überhaupt gibt.

    If (DeinArray.Length <= 999) Then
    'Alles gut
    Else
    'Alles schlecht
    End If

    Oder geht es darum, dass dein Array an sich Nothing ist? Falls ja, prüfe das vorab und beende ggf. die Methode.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich will garnicht Bergedorf Abfragen sondern von der ID den Wert. Ich habe zur veranschaulichung unten eine tabelle gemacht.


    ID
    Wert
    1
    Hauptbahnhof
    2
    Berliner Tor
    3
    Bremen
    4
    Woanders

    So nehmen wir mal an wir haben 4 Reiter

    Nun möchte ich mit den URL Parameter z.b ID 5 auslesen. In unserer Tabelle gibt es aber keine ID 5 und somit auch keinen Wert.
    Daher bekomme ich nun auch den Fehler in Visual Basic. Denn PHP kann keine ID 5 ausgeben da diese nicht vorhanden ist. Also wird nichts ausgegeben und Visual Basic Failt.

    Zu

    Quellcode

    1. st.lenght


    kriege ich folgenden Fehler

    Fehler 1 Eigenschaftenzugriff muss der Eigenschaft zugewiesen werden oder deren Wert verwenden.

    romins schrieb:

    Supi nun habe ich alles erreicht was ich wollte. Danke euch

    Würdest du bitte deine Lösung hier noch posten, damit andere auch was davon was haben?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Selbstverständlich. Ich frage nun mit

    VB.NET-Quellcode

    1. If (st.Length = Länge) Then


    ab welche Länge es hat und kann es dann so immer weiter schreiben.

    VB.NET-Quellcode

    1. If (st.Length = 7) Then
    2. Label2.Text = st(4)
    3. Label3.Text = st(3)
    4. Label4.Text = st(2)
    5. Label5.Text = st(1)
    6. Label6.Text = st(0)
    7. ElseIf (st.Length = 6) Then
    8. Label2.Text = st(4)
    9. Label3.Text = st(3)
    10. Label4.Text = st(2)
    11. Label5.Text = st(1)
    12. Label6.Text = st(0)
    13. ElseIf (st.Length = 5) Then
    14. Label2.Text = Nothing
    15. Label3.Text = st(3)
    16. Label4.Text = st(2)
    17. Label5.Text = st(1)
    18. Label6.Text = st(0)
    19. End If
    machs doch lieber dynamisch. Du hast ein String-Array, und hast 7 Labels.
    Tu die Labels auch in ein Array, dann passt beides wunnebar zusammen, und eleganter Code:

    VB.NET-Quellcode

    1. Dim labels = {Label1, Label2, Label3, Label4, Label5, Label6}
    2. Array.Reverse(labels)
    3. For i = 0 To st.Length - 1
    4. labels(i).Text = st(i)
    5. Next