| 

.NET C# Java Javascript Exception

6
Ahoi,
Ich hab da mal nen kleines Problem. Undzwar will ich ne ListBox mit vielen, vielen Werten füttern. Es sind Stringwerte. Es können zwischen 1 und sehr sehr viele Werte sein. Ich bekomm aber Probleme, so ab 20.000 Werten.

Funktion:
______ ________
|Wert 1 | |Wert 1 1 |
|Wert 2 | |Wert 1 2 |
|Wert 3 | |Wert 1 3 |

Ich klicke in der linken ListBox einen Wert an, der hohlt dann aus einer Datenbank die entsprechenden Werte und speicher sie in einem Dataset.
Danach startet eine Schleife, die die Werte in die Listbox Added und nebenbei noch zusatzwerte in eine ArrayList.

Das dauert jetz aber unglaubich lang und nach 60sek bekomm ich nen timeout.
Ich hab versucht, dass über ein DoEvents zu Lösen, dabei entsteht aber ein unglaubliches Chaos, da die Werte weite geadded werden, wenn ich das gewählte Element wechsel.
Ich kann auch schlecht ne wechselprüfung durchführer, da dieselbe Sub das ganze für 3 verschiedene ListBoxpaare macht.

Also, was kann ich tun, damit das ganze beschleunigt wird oder zumindest ansehnlicher für den Nutzer?

EDIT:
Listbox2 ist jeweils die Partnerlistbox vom auslöser.
Private Sub Listbox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbx1R.SelectedIndexChanged, lbx1S.SelectedIndexChanged, lbx1P.SelectedIndexChanged
For Each row As DataRow In DS.Tables(MyTab).Rows 'Viele viele Rows!!!'
MyListBox2.Items.Add(row("name"))

Dim listname As String = row("name") & "|" & MyListBox1.SelectedItem
MyArList.Add(listname)
Next
End Sub

Es ist halt nix außergewöhnliches. Das böse sind einfach die großen Datenmengen. vllt kann ein anderes Steuerelement damit ja besser umgehen...?
News:
16.12.2011
DerPunk 1,2k 1 7
DerPunk 1,2k 1 7
Kannst du mal den relevanten Code mit posten?
Floyd 16.12.2011
3 Antworten
3
Servus!

Ich würde Dir empfehlen, die String nach Möglichkeit nicht in einem Dataset sondern evtl. in einem List (Of String) zu speichern.

Die Listbox befüllst Du dann am besten nicht in einer Schleife sondern mittels der Funktion addRange (siehe Beispiel)

Ist innerhalb von Millisekunden drin...


Dim listeString As New List(Of String)

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
For i As Integer = 0 To 20000
listeString.Add(String.Concat("Wert: ", i))
Next
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Me.ListBox1.Items.AddRange(listeString.ToArray)
End Sub
16.12.2011
daWastl 277 1 7
Das bedeutet aber, dass er die Daten vom Dataset erst über den Umweg in die Stringliste kopieren muss. Das halte ich nicht für besonders elegant.
Jürgen Luhr 16.12.2011
Elegant isses zwar nicht, aber es hat geklappt ^^
DerPunk 16.12.2011
4
Das Langsame an der Geschichte ist mit Sicherheit das Visualisieren der Listbox. Es bietet sich an die neuen Datensätze nicht der Listbox hinzuzufügen, sondern dem Datencontainer dahinter. In dem Fall dem DataSet bzw. der DataTable.
Um das Hinzufügen zudem zu beschleunigen kann der Listbox noch mit BeginnUpdate und mit EndUpdate gesagt werden, wann das Hinzufügen beendet ist. Siehe dazu auch die MSDN.
Mein Codebeispiel braucht für das Hinzufügen von 100.001 Datensätzen ca. 3 Sekunden. Das sollte schon in Ordnung sein.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListBox1.DisplayMember = "column1"
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ds As New DataSet
Dim dt As New DataTable
ds.Tables.Add(dt)
dt.Columns.Add("Id", Type.GetType("System.Guid"))
dt.Columns.Add("column1", Type.GetType("System.String"))
For i = 0 To 100000
dt.Rows.Add(Guid.NewGuid, String.Concat("Text", i))
Next
ListBox1.BeginUpdate()
ListBox1.DataSource = dt.DefaultView
ListBox1.EndUpdate()
End Sub
16.12.2011
Jürgen Luhr 7,1k 1 9
3
Das liegt daran, dass die Listbox nach jedem Hinzufügen neu aufgebaut wird. Um das zu vermeiden kannst du die Methoden BeginUpdate() bzw. EndUpdate() verwenden.
16.12.2011
puls200 3,8k 7

Stelle deine .net-Frage jetzt!