2017-06-16 1 views
0

Ich habe eine DataGridView, wo Benutzer durch Keyup und Keydown bewegen.Bewegen Sie sich durch DataGridView und laden Sie Bilder ohne einfrieren UI

Momentan verwende ich das keyup Event, um das Bild in der imageBox abhängig vom Wert aus einer Spalte zu aktualisieren. Es funktioniert gut, wenn der Benutzer nur eine Zeile nach unten oder oben bewegt. Das Problem ist, dass wenn ein Benutzer schnell einige Zeilen bewegt, indem er ein paar Mal nach oben oder unten tippt, die Benutzeroberfläche immer wieder für einige Zeit einfriert.

Wie kann ich das Einfrieren der Benutzeroberfläche verhindern und das Laden von Bildern "Hintergrundarbeit" machen?

Bisher mein Code:

private void LoadPicture(string path) 
{ 
    threadworker = new Thread(() => pictureBox1.Image = path); 
    threadworker.Start(); 
} 

public void datenübergeben() 
{ 
    if (dataGridView1.CurrentRow.Cells["Bild1"].Value.ToString().Length != 0) 
    { 
     LoadPicture(dataGridView1.CurrentRow.Cells["Bild1"].Value.ToString()); 
    } 
} 
+1

nicht GUI-Steuerelemente in einem separaten Thread zuzugreifen. Verwenden Sie niemals einen leeren Try-Catch. – LarsTech

+0

Okay jetzt ohne Versuch - irgendwelche Lösungen zu fangen? –

+0

Wenn Sie eine asynchrone Aufgabe verwenden, wird die Benutzeroberfläche nicht blockiert, Bilder werden jedoch verzögert angezeigt. Informiere mich darüber, wie es läuft, oder ob du ein Code-Snippet benötigst, um dies zu tun. – sBanda

Antwort

0

Ich habe eine Idee, die sehr nützlich sein kann:

eine Unterroutine erstellen zwischen dem Gitter bewegen und die Loadpicture zu handeln. Rufen Sie LoadPicture auf, rufen Sie diese Routine auf.

Diese Routine:

1- den aktuellen GRID Reihe oder Bildnamen Get;

2- Starten Sie eine Task.Delay für einige Millisekunden oder sogar 1 Sekunde;

3- Holen Sie die aktuelle GRID-Zeile oder das Bild erneut in eine andere Variable und vergleichen Sie sie mit der ersten (Schritt 1);

Wenn es keine Änderung gibt, rufen Sie Loadpicture ...

Verwandte Themen