doppelten Einträgen in listView FindItemWithText

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von zneiva.

    doppelten Einträgen in listView FindItemWithText

    Hallo
    habe ein Problem mit doppelten Einträgen in einer Listview und "If .FindItemWithText"

    habe eine Listview mit subitems die in einer XML Datei gespeichert wird. nun möchte ich ein neues item hinzufügen möchte aber prüfen lassen ob in einem bestimmten subitem (in meinem fall eine BestandsNr.) schon vorhanden ist und falls dieses der Fall ist das das Hinzufügen abgebrochen wird. so sieht es bei mir momentan aus

    Quellcode

    1. With ListView1
    2. If .FindItemWithText(TextBox3.Text) IsNot Nothing Then
    3. MsgBox("BestandsNr.[" & TextBox3.Text & "] schon vorhanden", MsgBoxStyle.Critical, "Fehler")
    4. Return
    5. Else
    6. MsgBox("Bestand Hinzugefügt", MsgBoxStyle.Information, "Info")
    7. End If
    8. End With



    suchen tut er aber in allen Subitems, möchte aber das es nur in einem subitem sucht halt unter BestandsNr.

    zweites Problem es sucht nach dem ersten item das mit dem Textwert beginnt

    bedeutet wen in meiner listview z.B "BeStd10" enthält würde er mir auch bei "BeStd1" sagen das es diesen Eintrag schon gibt.

    Hoffe ich habe mein Problem verständlich rübergebracht

    Benutze: Visual Studio 2013
    Sprache Visual Basic
    Willkommen im Forum. :thumbup:

    zneiva schrieb:

    habe eine Listview mit subitems die in einer XML Datei gespeichert wird.
    Ich hoffe, dass Du noch nicht zu viel gemacht hast.
    Steige um auf DataGridView und DataTable. Da macht sich solch wesentlich einfacher.
    Mach Dir eine Form mit 3 Button (Rechnen, Speichern, Laden) und einem DataGridView.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private table As DataTable
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. InitDataTable()
    5. InitData()
    6. End Sub
    7. Private Sub InitDataTable()
    8. Me.table = New DataTable()
    9. Me.table.TableName = "Sinus"
    10. ' für das DGV
    11. Me.table.Columns.Add(New DataColumn() With { _
    12. .ColumnName = "Coordinate", _
    13. .DataType = GetType(Double) _
    14. })
    15. ' für das DGV
    16. Me.table.Columns.Add(New DataColumn() With { _
    17. .ColumnName = "Value", _
    18. .DataType = GetType(Double) _
    19. })
    20. End Sub
    21. Private Sub InitData()
    22. ' DataSource löschen
    23. Me.table.Clear()
    24. Me.DataGridView1.DataSource = Nothing
    25. End Sub
    26. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    27. ' Hier werden die Daten bereitgestellt:
    28. For i As Integer = 0 To 100
    29. Dim newRow As DataRow = Me.table.NewRow()
    30. newRow(0) = i
    31. newRow(1) = Math.Sin(i / 10)
    32. Me.table.Rows.Add(newRow)
    33. Next
    34. Me.DataGridView1.DataSource = Me.table
    35. End Sub
    36. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    37. Using dlg As New SaveFileDialog
    38. dlg.Filter = "XML-Dateien|*.xml"
    39. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    40. Return
    41. End If
    42. Me.table.WriteXml(dlg.FileName)
    43. End Using
    44. End Sub
    45. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    46. Using dlg As New OpenFileDialog
    47. dlg.Filter = "XML-Dateien|*.xml"
    48. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    49. Return
    50. End If
    51. Me.table.ReadXml(dlg.FileName)
    52. End Using
    53. Me.DataGridView1.DataSource = Me.table
    54. End Sub
    55. End Class

    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Danke für die schnelle antwort

    dachte mir das es mit der LV schwieriger wird, aber das einfache Design von der LV hatte mir gefallen und auch das markieren der Spaltedas ist im DGV mit einem Pfeil gelöst der die markierte Spalte anzeigt was ich nicht so schön finde (vom Design).

    wahrscheinlich kann man das auch ändern werde mich später am Abend mit dem DGV mal auseinandersetzen.

    leider habe ich schon etwas gemacht mit dem LV, naja werde das wohl dann alles ein wenig oder mehr abändern ^^
    ListView ist einfach ein Holzweg, und je früher man sich davon trennt desto besser, aber egal wie spät: es ist immer noch früher als noch später ;)

    Das Design kann man mit DGV mit 2 Einstellungen hinkriegen - jedenfalls die Hauptsache.
    Dgv-Icons ticken normal etwas anders, aber auch das kann man in den Griff kriegen: Datagridview, aussehend wie Listview
    so habe jetzt erstmal eine Datenbank angelegt da es wohl doch besser ist als eine txt oder xml Datei zu speichern.
    und auch eine DGV
    habe mich mal an diesem Video gehalten Youtube

    so nun habe ich aber schon 2 Probleme
    das DGV fülle ich mit textboxen und Buttens neuen Einträge hinzufügen oder bearbeiten.also nicht über den TableBindingNavigator.

    1. Problem ist das sich die ID (Datentyp auf int) nicht automatisch reinschreibt, da sie kein nullwert haben darf bekomme ich eine Fehlermeldung. zum weiteren Testen habe ich die ID erstmal händisch eingegeben

    2. Problem ist das zwar das DGV gefüllt wird aber anscheinet nicht die Datenbank, den beim neustart meiner Form sind die Daten futsch.Ich vermute mal das ich nicht das DGV befüllen muss sondern meine Datenbank, oder das ich das DGV nach dem befüllen in die Datenbank schreibe.
    werde heute Abend mal nach ein paar Lösungen suchen

    zneiva schrieb:

    so habe jetzt erstmal eine Datenbank angelegt
    Mach einfach mal mein Beispiel in ein neues Programm und spiele ein wenig damit, damit Du das verstehst.
    Höre auf, gleich im höchsten Niveau proggen zu wollen, das schaffst Du frühestens in 3 Jahren.
    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!
    fein, dann hast du dich jetzt evtl. 12h mit was völlig unnötigem beschäftigt, denn wie bereits um 11.41 erwähnt: Du brauchst keine DB. Eine DB ist nur mindestens 4MB Overhead in deim Proggi.

    Und völlig offen noch, ob das Abspeichern überhaupt richtig funzt - schließlich sind die Daten ja noch scheinbar futsch.
    Hierfür die Lösung liegt meist hierin verborgen: Ins Ausgabeverzeichnis kopieren: immer

    Mist - zu spät ;)

    Aber jetzt fleissig testen: Datensätze zufügen, speidhern, ändern, speichern, löschen speichern, nochmal zufügen, speichern, erneut einlesen.

    Weil deine Variante der Client-seitigen Primkey-Generierung ist sehr ungewöhnlich, und funzt evtl. nicht immer richtig.
    so kommen wir zum eigentlichen Problemdas
    ich halt doppelte Einträge beim hinzufügen nicht zulasse.

    das Hinzufügen aus einer 2Form in die Datenbank funktioniert aber das er prüft ob der Eintag schon Vorhanden ist funktioniert noch nichthabe insgesamt 28 Spalten die ersten 4 sind
    ID-Name-Zuchtname-BestandsNr_

    kurze Info noch zur ID, die ID trägt sich selber ein fängt von 0 an und steigt dann um +1 beim Hinzufügen

    un möchte ich prüfen ob in der 4 Spalte (BestandsNr_) der neue Eintrag schon vorhanden ist.
    Mein Momentaner Code:


    VB.NET-Quellcode

    1. Public Class Neues_Tier
    2. Dim i As Integer
    3. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim count As Integer = Form1.TiereDataGridView.Rows.Count + 1
    5. For Me.i = 0 To count
    6. Next
    7. If BestandsNr_TextBox.Text = Form1.TiereDataGridView.Rows(i).Cells(3).Value Then
    8. MsgBox("text vorhanden")
    9. Else MsgBox("text nicht vorhanden")
    10. End If
    11. .....
    12. End Sub



    wen ich das richtig versanden habe das ist doch Cells(3) die Spalte (4 fängt doch bei 0 an oder) " BestandsNr_"

    und Rows(i) ist die Reihe, (meine Einträge in der Spate "BestandsNr_")
    so wen ich dann den Button1 drücke bekomme ich eine Fehlermeldung" System.ArgumentOutOfRangeException"
    und diese Zeile wird markiert
    " If BestandsNr_TextBox.Text = Form1.TiereDataGridView.Rows(i).Cells(3).Value Then"


    kann es sein das er nicht weis wie viele Einträge in meiner DB sind und deswegen uneidlich danach suchen würde, so das er in der Schleife feststeckt?
    ok auch da habe ich eine Lösung gefunden bzw das Problem.


    VB.NET-Quellcode

    1. Dim count As Integer = Form1.TiereDataGridView.Rows.Count - 1 'hier muss statt ein plus ein minus stehen
    2. For Me.i = 0 To count - 1 ' und hier hatte ich auch ein -1 vergessen
    3. Next
    4. If BestandsNr_TextBox.Text = Form1.TiereDataGridView.Rows(i).Cells(3).Value Then
    5. MsgBox("text vorhanden")
    6. Else
    7. ...


    so jetzt funktioniert es auch :D

    EDIT:

    Hier noch ein Tipp
    falls die Datenbank leer ist funktioniert das ganze nicht, weil er nirgendwo Anfangen kann mit der For schleife(glaube ich zumindest) daher mache ich vorher eine abfrage ob in der Datenbank überhaupt ein Eintrag drin ist mit:

    VB.NET-Quellcode

    1. Dim leer As Integer = Form1.TiereDataGridView.Rows.Count
    2. If leer = "0" Then GoTo Line1 Else


    "Line1": habe ich dort wieder eingesetzt wo "MsgBox("text nicht vorhanden")" steht.
    ["GoTo Line1" bewirkt das es dort hinspringt wo "Line1:"steht (kannte ich noch aus batch)]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „zneiva“ ()