2013-02-19 5 views
6

Ich schein die ListBox.Refresh() -Methode missverstehen und ich hatte gehofft, jemand könnte mir helfen.ListBox hat Datenquelle gesetzt, aber Refresh tut nichts

Was ich versuche zu tun:
Ich möchte die Daten einer Listbox (Quelle = Tabelle einer SQL-Datenbank) bei der Initialisierung eines Windows-Formulars laden. Wenn der Benutzer Daten zur Datenbank hinzufügt, möchte ich die Listbox aktualisieren.

Logic:
ich eine SQL-Datenbank als meine Quelle haben, wird es eingestellt, wie:

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

DBquery.informationRetreval() eine statische Methode in der statischen Klasse meine DBQuery ist. Es erstellt nur eine Tabelle aus der Datenbank und gibt dann die Tabelle zurück.

stelle ich die Datenquelle innerhalb der gleichen Methode wie der InitializeComponent (so wird meine Listbox mit den vorhandenen Daten laden):

public Settings() 
    { 
     InitializeComponent(); 
     listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 
    } 

Wenn der Benutzer mehr Daten fügt hinzu: Ich habe eine Methode aufrufen, in dem ich das hinzufügen Daten in die Datenbank und dann rufe ich:

listBoxDays.Refresh(); //update listbox 

Das Problem: Diese das Listenfeld nicht aktualisiert. Nach der Initialisierung meiner Listbox werden die Daten gefüllt, aber nachdem sie sich nicht ändern (daher funktioniert die Aktualisierung nicht). Warum das? Ich könnte die DataSource erneut einstellen, aber das fühlt sich schlampig an. Nachdem ich in die Dokumentation geschaut habe, ist mir der Event-Handler DataSourceChanged aufgefallen, der vielleicht mehr für das ist, wonach ich suche. Trotzdem warum sollte die Arbeit nicht auffrischen?

Vielen Dank für Ihre Geduld. Bitte lassen Sie mich wissen, wenn ich klarer sein muss.

Antwort

9

Refresh(): Erzwingt, dass das Steuerelement seinen Clientbereich ungültig macht und sofort sich selbst und alle untergeordneten Steuerelemente neu zeichnen.

Aktualisieren wird Ihr Steuerelement nicht erneut binden, es wird nur dazu führen, dass das Steuerelement neu gezeichnet wird. Sie werden die DataSource wieder mit

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

und wieder binden sie setzen müssen.

Quelle: (Bsp. Eine andere Abfrage) Microsoft MSDN

+0

Wäre es sinnvoller, den Event-Handler zu verwenden: ListControl.DataSourceChanged ... tritt auf, wenn sich die Datenquelle ändert? – 40Alpha

+0

Ich würde sagen, eine Methode zu erstellen, die das Steuerelement bereinigt und bindet und es von der InitializeComponent() und von überall her aufrufst, wo Sie die .Refresh() - Funktion verwenden. –

+1

Außerdem habe ich zumindest in der Version von VB, mit der ich arbeite, eine Fehlermeldung erhalten, dass man Einträge nicht löschen kann, wenn Daten an eine Datenquelle gebunden sind. Alles, was ich hinzufügen musste, war eine Zeile namens 'Listbox.DataSource = Nothing' hinzuzufügen und dann meine Objekte zu löschen und meine Daten erneut zu binden. – PsychoData

15

Es wird nur aktualisiert, wenn Objekte geändert haben, nicht die Daten. Sie können dies tun:

listBoxDays.DataSource = null; 
listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

um es zu aktualisieren ... jedes Mal, wenn Sie müssen.

+2

großartig! Ich brauche nicht, warum wir dies tun müssen – rajeemcariazo

+0

Dies: "Es wird nur aktualisiert, wenn Objekte geändert haben (z. B. eine andere Abfrage), nicht die Daten" in vielen anderen Antworten zu dieser Frage/Problem fehlt – Pavenhimself