VB.Net ListBox mit mehreren Spalten, diese dann mit array füllen

Hallo

ein ganz einfaches Problem
Ich habe in Visual Basic 2010 ein Userform mit einer Listbox.
In einem Array stehen 447 Datensätze in drei Spalten.
Ich möchte jetzt das Array an die Listbox übergeben
Bei Excel Makros war das ja mit 

TextBox1.ColumnCount = „3“
TextBox1.ColumnWidths = „20 PT; 52PT; 210PT“
TextBox1.List() = Array1

möglich.
Wie ist das jetzt bei Visual Basic? Ich möchte später auch einzelne Datensätze anklicken und mit diesen weiter arbeiten. Dafür eigenet sich doch eine Listbox am besten oder?

ich meinte natürlich statt textbox1 Listbox1

in der 1. zeile von dem Array1 steht
hallo              du              da

Ich habe mal etwas google gequelt, und irgendwie gibt es da wohl keine saubere Methode. Jetzt brauch ich ne andere Idee.

Wie kann ich eine Liste erstellen, in den 3 Spalten sind.
Diese Liste wird dann mit Artikel befüllt in der form
Arikelnummer Hersteller Preis
000403 Lutscher 100€

ich möchte dann auf einen Eintrag klicken (000403) die komplette Zeile wird dann markiert und die Artikelnummer wird dann in eine MSGBOX angezeigt (nur zum Testen erstmal)

Seh ich das richtig, das eine ListView dafür auch ungeeignet ist, da es die Einträge wie die Listansicht von Windows ablegt?

Hallo,

als erstes sollten wir uns um eine vernünftige Datenhaltung kümmern. Das heißt, deine Artikel in eine Klasse verpacken:

Class Artikel
 Public Property Artikelnummer As String
 Public Property Hersteller As String
 Public Property Preis As Double
End Class

Dann passen wir das ListView an. Das könnte theoretisch auch per Reflection geschehen, aber der Einfachheit halber bleiben wir mal beim Hardcoden (z.B. in Form_Load):

listView.Columns.Add(New ColumnHeader() With { .Text = "Artikelnummer" })
listView.Columns.Add(New ColumnHeader() With { .Text = "Hersteller" })
listView.Columns.Add(New ColumnHeader() With { .Text = "Preis" })

listView.FullRowSelect = True
listView.View = View.Details

AddHandler listView.ItemSelectionChanged, AddressOf SelectionChanged

Und dann können wir schon unsere Daten einfüllen:

For Each artikel As Artikel In alleArtikel
 Dim item = New ListViewItem({ artikel.Artikelnummer, artikel.Hersteller, artikel.Preis.ToString() })
 item.Tag = artikel
 listView.Items.Add(item)
Next

Dann kümmern wir uns noch um das Auswählen:

Private Sub SelectionChanged(sender As Object, e As ListViewItemSelectionChangedEventArgs)
 If e.IsSelected And e.Item IsNot Nothing Then
 Dim artikel = DirectCast(e.Item.Tag, Artikel)
 MessageBox.Show(artikel.Artikelnummer & ", " & artikel.Hersteller & ", " & artikel.Preis)
 End If
End Sub

Nico

Ok Ok

damit ich das auch alles verstehe :smiley:

Was hat das mit dieser Class auf sich (Sorry bin was vb.net angeht ein totaler anfänger, habe vorher immer nur mit excel makros programmiert, und versuche jetzt auf vb.net um zu steigen)

listView.Columns.Add(New ColumnHeader() With { .Text = „Artikelnummer“ })
listView.Columns.Add(New ColumnHeader() With { .Text = „Hersteller“ })
listView.Columns.Add(New ColumnHeader() With { .Text = „Preis“ })
Das verstehe ich soweit, hiermit kann ich die "Tabellen überschrift einfügen

listView.FullRowSelect = True
listView.View = View.Details
das erste sorgt dafür das wenn ich ein artikel anklicke, die komplette reihe ausgewählt wird
aber was sagt mir die zweite reihe?

For Each artikel As Artikel In alleArtikel
Dim item = New ListViewItem({ artikel.Artikelnummer, artikel.Hersteller, artikel.Preis.ToString() })
item.Tag = artikel
listView.Items.Add(item)
Next

Hier meckert mein Programm
alleArtikel wurde nicht deklariert

Wie fülle ich den jetzt die Tabelle mit meinen daten?

Was hat das mit dieser Class auf sich

Hm…, wenn es schon bei Klassen hängt, solltest du dir unbedingt mal ein paar einführende Tutorials zu objektorientierter Programmierung einsehen. Klassen sind ein fundamentales Konzept. Grob gesagt kann eine Klasse als Vorlage für Objekte angesehen werden. In diesem Fall sagen wir, dass Objekte vom Typ Artikel die angegebenen Eigenschaften haben.

listView.View = View.Details

aber was sagt mir die zweite reihe?

Das stellt nur die Darstellung der Elemente auf eine Detailansicht um. Ansonsten werden die Elemente standardmäßig als Kacheln, nicht als Zeilen, dargestellt.

For Each artikel As Artikel In alleArtikel

Hier meckert mein Programm
alleArtikel wurde nicht deklariert

Ich bin davon ausgegangen, dass du selbst sieht, dass alleArtikel hier die Variable darstellen soll, in der deine ganzen Artikel liegen. Entweder ein Array oder eine Liste oder sonst irgendwas, worüber man iterieren kann. Je nachdem, wie deine Daten vorhanden sind, musst du die Schleife etwas anpassen. Das Grundprinzip sollte aber erkennbar sein.

Nico