Arbeiten mit Listview

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Nia24.

    Arbeiten mit Listview

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim index As Integer
    3. Dim strAusgabe As String
    4. strAusgabe = ListView1.Items(index).Text
    5. For i = 1 To ListView1.Items.Count - 1
    6. strAusgabe = strAusgabe & "," & ListView1.Items(index).SubItems(i).Text
    7. Next i
    8. MsgBox(strAusgabe)




    das hab ich jetzt als code, fehlermeldungen gibt es keine mehr, aber machen tut esgar nix.
    gibt es einen bestimmten platz im quellcode wo ich es positionieren sollte?
    ich habe eine windows-form gemacht, vorher kommt noch ein info-fenster mit text.
    auf dieser form sind eingabe-fenster und die listview, die die eingaben dann anzeigt, mit klick auf einen button beendet es die form dann.
    im moment habe ich in diesem quellcode, dann obiges stehen.
    fragen sind nun: wo platziere ich es am besten?
    und wie kann ich mit den daten dann weiterarbeiten? geht das auch in einer anderen form?

    danke schonmal
    Auweia, du scheinst ja gar keinen Plan zu haben? :huh:
    Wenn du auf die Listview in einer anderen Form zugreifen willst, mußt du das dem Prog auch mitteilen z.B. FormBlub.ListviewX....
    Warum jetz da nischt ausgegeben wird, dürfte daran liegen, dass die angesprochene Listview leer is.
    Ich empfehle dir erstma Grundlagen zu pauken, um die Zusammenhänge zu verstehen. Am besten mit Consolenanwendungen anfangen und lesen, lesen, probieren, lesen usw.
    Empfehlenswerte Literatur gibs kostenlos bei Gallileo Openbook.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hi,

    also prinzipiell heist keine Fehlermeldung ja nicht das es genau das tut was du dir vorstellst.

    Ich versuch mal nachzuvollziehen, was du eigentlich machen willst.
    das hab ich jetzt als code, fehlermeldungen gibt es keine mehr, aber machen tut esgar nix.
    Du gibst etwas ein und das Ganze soll dann in der Listview erscheinen ?
    Dann solltest du dir überlegen, welches Event dazu führt, dass der eingetragene Wert/Text in die Listview übertragen wird.
    Denn einfach so passiert schon mal gar nix. Sonst weis dein Programm ja nicht, wann es denn nun etwas neues Eintragen soll.
    Ich empfehl da für den Anfang ein Button der diese Ereignis auslöst.

    Das beantwortet dann natürlich auch dein Frage wo der ganze Code zu stehen hat. Schau dir dazu einfach mal den Code an der das Programm mit deinem vorhandenen Button beendet.

    und wie kann ich mit den daten dann weiterarbeiten? geht das auch in einer anderen form?

    Klar geht das, du solltest aber erst mal rausfinden wie du denn das Ganze in die ListView bekommst. Dann wie man damit weiterarbeitet und zum Schluss kannst du an weiter Formen denken :). Alles Andere wird dich nur frustrieren.
    in der listview drin hab ich ja die daten, ich wollte sie nur auslesen damit.
    der angegebene quellcode sollte dann die daten auslesen und den index angeben, da ich die eingegebenen daten überprüfen muss, um danach damit weiterzurechnen.

    grundlagen wären schon mal toll, aber im moment zeitlich nicht drin, muss nur das eine programm fürs studium machen und danch lass ich das erstmal wieder und konzentrier mich auf meine prüfungen.
    sonst würd ich ja nicht so blöde fragen stellen.
    das zählen der zeilen war doch einfach gewesen, aber jetzt hab ich noch einige unklarheiten:
    ,
    1. Ich sortiere ja die Daten nach der ersten Zeile, aber wie kann ich die Zahlen richtig sortieren? Im Moment sortiert es á la "2, 3, -3, 5, -7,...."
    2. Wie kann ich denn die einzelnen Zellinhalte ansprechen? Ich möchte gern mit den Zahlen weiterrechnen und sie in Formeln und Schleifen verwenden.
    3. Kann ich die Daten aus der Listview vor dem Bearbeiten in eine zweite Listview kopieren und dabei die Daten, wenn in der 3. Spalte ein Eintrag ist, verdoppeln?
    Zu 1. Ein immer wiederkehrendes Problem: Die Item-Eigenschaft Text ist String. Strings werden alphabetisch sortiert, weswegen z.B. 10<2 ist. Da hilft nur Konvertierung in einen Zahlentyp (Integer, Double, Single). Da ist die Welt wieder in Ordnung. Das ist gerade fürs Rechnen wichtig. Ganz oben allererste Zeile "Option Strict On" und dann alle unterstrichenen Fehler beseitigen. Die IDE gibt dazu Hinweise (Mauszeiger drüber > rotes Ausrufezeichen anklicken und schauen).
    Zu 2. Besser ist es (und auch einfacher) die Listview dazu zu nutzen, wofür sie "erfunden" wurde: Zum Anzeigen von Daten. D.h.: Führe deine Variablen als Zahlentypen global deklariert im Programm. Rechne mit DIESEN Variablen. Bei entsprechenden Events (Button nach Eingabe, Berechnung durchgeführt, Daten von irgendwoher geladen) fülle die Listview mit den Daten. Dabei mit CStr(Zahl) in String konvertieren. Trenne den Code der Berechnung vom Code für die Anzeige. Wenn du dein Prog dahingehend überarbeitest, wirst du deutlich weniger Schwierigkeiten haben.
    Zu 3. Natürlich kannst du Items in eine andere Listview kopieren. was du mit Daten verdoppeln meinst, weiß ich zwar nicht, aber Kamel * 2 ergibt kein sinnvolles Ergebnis. (Siehe Zu 2.)

    Zur Erklärung:
    Die Items der Listview sind die Auflistung aller Zeilen (Zeile = Listviewitem). Das Listviewitem kann seinerseits beliebig viele Subitems beinhalten, ist also ebenfalls eine Auflistung, verfügt aber über die Eigenschaft Text, welche quasi den Titel der Zeile darstellt. Wichtig ist, wenn du einer Listview ein Listviewitem mit 3 Subitems addest, müssen der Listview auch die entsprechende Anzahl Spalten(Columns) VORHER hinzugefügt werden. (guckst du Beispiel)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    danke dir.
    1. habe ich jetzt so gelöst, einen fehler hab ich noch, mal gucken wann der denn gehen möchte.
    2. das versuch ich schon, wusste aber nicht genau, wo ich das jetzt einbauen könnte, im code in den entsprechenden Subs ist grade meine Variante.
    3. das ist für eine Mathematische Berechnung, da muss ich bei Vorhandensein des 3. Wertes die ersten 2 Werte Doppelt aufführen.
    hab nochmal eine kurze frage dazu:

    kennt sich jemand mit items klonen aus? ich wollte erst die items mit hilfe einer bedingung, doppelt eintragen lassen.

    VB.NET-Quellcode

    1. Dim item As New ListViewItem
    2. If Ableitung.TextLength > 0 Then
    3. item.Text = Stützstelle.Text
    4. item.SubItems.Add(Funktionswert.Text)
    5. item.SubItems.Add(Ableitung.Text)
    6. Me.ListView1.Items.Add(item)
    7. item.SubItems.Add(Stützstelle.Text)
    8. item.SubItems.Add(Funktionswert.Text)
    9. Me.ListView1.Items.Add(item)
    10. Stützstelle.Text = ""
    11. Funktionswert.Text = ""
    12. Ableitung.Text = ""
    13. Else
    14. item.Text = Stützstelle.Text
    15. item.SubItems.Add(Funktionswert.Text)
    16. item.SubItems.Add(Ableitung.Text)
    17. Me.ListView1.Items.Add(item)
    18. Stützstelle.Text = ""
    19. Funktionswert.Text = ""
    20. Ableitung.Text = ""
    21. End If
    22. ' SET SORT
    23. ListView1.Sorting = SortOrder.Ascending
    24. ListView1.ListViewItemSorter = New NumericLVSorter ' the SORTER

    Das passiert, wenn ich die WErte einfügen lasse in mein Listview, funktioniert ganz gut, hat aber zwei Probleme, erstens beschwert sich das Programm, wenn ich es nur einen Wert ordnen lasse. versteh ich, krieg ich irgendwie noch hin.
    Aber die Fehlermeldung "Das Element 3 kann nur an einer Stelle hinzugefügt oder eingefügt werden. Entfernen Sie es von der aktuellen Position, oder klonen Sie es." kann ich nicht ganz nachvollziehen. Wie kann ich dass denn klonen, über Google finde ich leider auch nichts dazu, geschweige denn in meiner Literatur.
    Ich kanns jetz grade nich genau nachvollziehen, aber du füllst im 1. If-Zweig 3 Spalten(Subitems) und schiebst das Item in die Listview. Anschließend gibst du dem Item noch 2 Subitems hinzu und fügst das Item (Das ist immernoch das 1. Item) der Listview erneut zu, jetzt aber mit insges 5 Spalten. Da wird es vermutlich knallen.
    Wenn deine Listview 5 Spalten haben, müssen auch die Items 5 Spalten füllen und nicht 8 oder 2 (obwohl <5 noch gehen könnte...)
    Solldas allerdings ein neues Item sein bei Zeile 10, dann instanziere vorher ein neues Item mit Item= new ListviewItem.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    zum nachvollziehen:
    ich möchte die 3 Werte als eine Zeile in die Listview einfügen, wenn der dritte Wert eingegeben wurde, dann sollen die ersten 2 Werte als nächste Zeile in die Listview nochmal eingegeben werden. ich hab das jetzt als neues Item gemacht, aber anstelle der werte gibt es immer eine neue leerzeile aus.
    Ich habe deinen Fehler mal nachgebaut. Also folgendesdes:
    Als erstes deshier im FormLoad
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. With LV1
    3. 'Spalten hinzufügen
    4. .Columns.Add("Spalte1")
    5. .Columns.Add("Spalte2")
    6. .Columns.Add("Spalte3")
    7. 'Ansicht auf Details, damits de die sehen kannscht
    8. .View = View.Details
    9. End With
    10. End Sub
    Das sollte sich ja selber verklären.
    Nu habich 3 subs gemacht. Die erste is deiner Variante nachempfunden, bei ders den Fehler gibt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub fallig_Fölsch()
    2. 'Item instanzieren
    3. Dim item As New ListViewItem
    4. 'Werte für Item setzen
    5. item.Text = "Test11"
    6. item.SubItems.Add("Test12")
    7. item.SubItems.Add("Test13")
    8. LV1.Items.Add(item)
    9. LV1.Items.Add(item) 'Das nochmalige Hinzufügen verursacht deine Fehlermeldung
    10. End Sub
    Das liegt daran, dass Items vom Typ Objekt sind und damit Referenztypen. Es ist nun nicht möglich, dass 2 Items der Listview auf das gleiche Objekt verweisen.
    Deshalb gibs die Möglichkeit, des zu clonen. Mit ein bisserl probieren mit der Intellisense stößt man auf folgenden funktionierenden Weg:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Klon()
    2. 'Item instanzieren
    3. Dim item As New ListViewItem
    4. 'Werte für Item setzen
    5. item.Text = "Test11"
    6. item.SubItems.Add("Test12")
    7. item.SubItems.Add("Test13")
    8. LV1.Items.Add(item)
    9. 'einen Clone (Kopie des Oginals) hinzufügen
    10. LV1.Items.Add(item.Clone)
    11. End Sub
    Hier wird exakt das gleiche Item 2 x hinzugefügt. Item 2 ist dabei eine Kopie des 1. Items, also verweist auf eine neue Instanz (anderes Objekt)
    Eine andere Möglichkeit, 2 Items mit variierendem inhalt hinzuzufügen ist die hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub _2Items()
    2. 'Item instanzieren
    3. Dim item As New ListViewItem
    4. 'Werte für Item setzen
    5. item.Text = "Test11"
    6. item.SubItems.Add("Test12")
    7. item.SubItems.Add("Test13")
    8. LV1.Items.Add(item)
    9. 'neues Item instanzieren
    10. item = New ListViewItem
    11. 'Werte für Item setzen
    12. item.Text = "Test21"
    13. item.SubItems.Add("Test22")
    14. item.SubItems.Add("Test23")
    15. item.SubItems.Add("Test33") 'wird nicht angezeigt, da nur 2 Spalten hinzugefügt sind
    16. LV1.Items.Add(item)
    17. End Sub

    Und hier kannst du vefolgen, wie das mit der Objektreferenz funzt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub referenzTest()
    2. 'Item instanzieren
    3. Dim item As New ListViewItem
    4. 'Werte für Item setzen
    5. item.Text = "Test 1"
    6. item.SubItems.Add("Test 1")
    7. item.SubItems.Add("Test 1")
    8. LV1.Items.Add(item)
    9. 'hier verweist item immer noch auf das hinzugefügte item
    10. item.SubItems(0).Text = "item"
    11. 'hier verweist item auf ein neues Objekt
    12. item = New ListViewItem
    13. item.SubItems(0).Text = "neues item"
    14. LV1.Items.Add(item)
    15. End Sub

    Fiel Fergnügen beim Testen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    danke dir, verstanden hab ich das schon, nur mein Problem beim Clonen ist eben, dass ich nur zwei der drei WErte nochmals eintragen möchte. oder kann ich diesen danach einfach wieder rauslöschen lassen, was wäre denn einfacher?

    danke nochmal für die erklärung mit den referenztypen.was muss ich denn mit opion strict on machen, damit das clonen da funktioniert, weißt du das zufällig?
    Nuja, kannste doch machn. Dein einzigster Fehler in deinem Code war doch, dass vor dem Eintragen der beiden Werte für das 2. Item einfach stehen muss item=new Listviewitem. das versuch ich dir doch die ganze Zeit zu erklären zu tun!
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: