2017-03-12 2 views
-3

im hinzufügen Artikel in listbox mit Datenbankwerten versuchen, und versuchen, es zu entfernen, indem Sie einen Doppelklick Ereignis verwenden, möchte ich Artikel im Listenfeld und der Preis für das Element entfernen, wird dem TxtTotal abziehen. Text. beispielsweise. Ich füge einen Artikel im Listbox-Namen "Package1" mit dem Preis von 299 hinzu und füge einen anderen Artikelnamen "Package2" mit dem Preis von 300 hinzu, wenn ich "Package1" entferne, wird der txtTotal eine Zahl von 299 verringern und es wird 300., wie Elemente in listbox löschen C#

hier ist mein Code:

void fillCombo() 
    { 

     string constring = "server=localhost;port=3306;username=root;password=root"; 
     string Query = "Select * from dbinfo.tbladvance;"; 
     MySqlConnection con = new MySqlConnection(constring); 
     MySqlCommand cmdDB = new MySqlCommand(Query, con); 
     MySqlDataReader myReader; 
     try 
     { 
      con.Open(); 
      myReader = cmdDB.ExecuteReader(); 

      while (myReader.Read()) 
      { 
       string sName = myReader.GetString("Names"); 
       comboBox1.Items.Add(sName); 



      } 
      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string constring = "server=localhost;port=3306;username=root;password=root"; 
     string Query = "Select * from dbinfo.tbladvance where Names='" + comboBox1.Text + "' ;"; 
     MySqlConnection con = new MySqlConnection(constring); 
     MySqlCommand cmdDB = new MySqlCommand(Query, con); 
     MySqlDataReader myReader; 
     try 
     { 
      con.Open(); 
      myReader = cmdDB.ExecuteReader(); 

      while (myReader.Read()) 
      { 
       double sPrice = myReader.GetDouble("Price"); 
       string sDesc = myReader.GetString("Description"); 
       txtPrice.Text = sPrice.ToString(); 
       txtDesc.Text = sDesc; 
      } 
      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

    } 

    int total; 
    private void button1_Click(object sender, EventArgs e) 
    { 
     listBox1.Items.Add(comboBox1.Text); 

     int num1 = int.Parse(txtPrice.Text); 
     int num2 = int.Parse(txtTotal.Text); 

     total = num1 + num2; 

     txtTotal.Text = total.ToString(); 

    } 

    private void listBox1_DoubleClick(object sender, EventArgs e) 
    { 

     string constring = "server=localhost;port=3306;username=root;password=root"; 
     string Query = "Select * from dbinfo.tbladvance;"; 
     MySqlConnection con = new MySqlConnection(constring); 
     MySqlCommand cmdDB = new MySqlCommand(Query, con); 
     MySqlDataReader myReader; 

     con.Open(); 
     myReader = cmdDB.ExecuteReader(); 

     while (myReader.Read()) 
     { 
      for (int n = listBox1.Items.Count - 1; n >= 0; --n) 
      { 
       string sName = myReader.GetString("Names"); 
       string removelistitem = sName; 
       if (listBox1.Items[n].ToString().Contains(removelistitem)) 
       { 
        listBox1.Items.RemoveAt(n); 
       } 
      } 





     } 
     con.Close(); 


    } 

i mysql durch die Art und Weise bin mit, Vielen Dank im Voraus :)

Antwort

0

ich hoffe, dass ich einige Punkte des Interesses an Ihrem gelieferten Code erklären. Es gibt verschiedene Dinge, die nicht unbedingt falsch, aber unnötig und fehleranfällig sind. Ich werde darauf hinweisen, beginnend mit der Schwere jedes unnötigen Code-Snippets.

Zuerst schauen Sie sich bitte an den unten Linien ...

string constring = "server=localhost;port=3306;username=root;password=root"; 
string Query = "Select * from dbinfo.tbladvance;"; 
MySqlConnection con = new MySqlConnection(constring); 
MySqlCommand cmdDB = new MySqlCommand(Query, con); 
MySqlDataReader myReader; 

Der obige Code ist in der fillCombo Verfahren. Hier scheint es, Sie eine Verbindung zu und Abfragen (ein DataTable Ich vermute, bin aus dem Namen dbinfo.tbladvance) eine Datenbank und mit den DataTable in dieser Abfrage das Kombinationsfeld mit Saiten aus einer Spalte füllen namens „Namen“. Dann ist die Verbindung geschlossen.

Dies ist in Ordnung, da man annehmen würde, dass Sie dies nur einmal tun müssten. Gehen wir nun zur nächsten Methode im Code comboBox1_SelectedIndexChanged über. Diese Ereignismethode wird jedes Mal ausgelöst, wenn sich die Kombinationsfeldauswahl ändert.

string constring = "server=localhost;port=3306;username=root;password=root"; 
string Query = "Select * from dbinfo.tbladvance where Names='" + comboBox1.Text + "' ;"; 
MySqlConnection con = new MySqlConnection(constring); 
MySqlCommand cmdDB = new MySqlCommand(Query, con); 
MySqlDataReader myReader; 

Hier scheint es, dass Sie wieder eine Verbindung zu einer Datenbank öffnen. Diesmal soll die Abfrage die Übereinstimmung erhalten, bei der comboBox1.Text mit der Zeichenfolge in der Spalte "Namen" der Datentabellen übereinstimmt. Der Grund dafür ist, dass Sie den Preis und die Beschreibung des ausgewählten Pakets benötigen. Nachdem die Informationen aus der Datenbank zurückgegeben wurden, werden diese Werte in die entsprechenden Textfelder eingefügt. Dann schließen Sie die Verbindung und beenden Sie.

Ich könnte mich diesbezüglich irren, aber ein mögliches Problem mit der comboBox1_SelectedIndexChanged Methode ist, dass es das Öffnen und Schließen der Datenbank JEDER MAL der Benutzer die Combobox Auswahl ändert. Dies ist nicht notwendig, da sich die Liste der Werte in der Combobox NIE ändert.

Der Grund der Code die Datenbank zu halten, muss die Abfrage ist, dass der Code nicht die erste Abfrage speichert. Wenn Sie sich die Methode fillCombo() ansehen, werden Sie feststellen, dass der Code diese Daten von einer Spalte mit dem Namen Names erhält. Wenn man sich die comboBox1_SelectedIndexChanged Methode anschaut, sieht es so aus, dass es auch zwei andere Spalten in dieser Datenbank gibt: Price und Description. Unter der Annahme, dass diese Daten statisch sind, während der Benutzer das Programm verwendet, würde das Speichern der Daten (Name, Preis, Beschreibung) auf DataTable die Dinge nicht nur einfacher machen, sondern würde auch die Anzahl der Abfragen auf Ihre Datenbank auf eins reduzieren.

Wenn sich die Daten in Echtzeit ändern und der Benutzer Zugriff auf diese neuen Informationen in Echtzeit haben muss, sollten Sie einen anderen Ansatz in Betracht ziehen. Dies scheint jedoch nicht der Fall zu sein.

Punkt der oben genannten Grundsatz ist, dass Sie die erforderlichen Daten in eine DataTable lesen sollten. Verwenden Sie dann diese DataTable, um Ihre Abfragen auszuführen.Dadurch müssen Sie die Datenbank nicht mehr öffnen und schließen und den Code nicht mehr aufräumen.

Zweitens: Gesamtkosten: Die Schaltfläche Klick-Methode sieht mysteriös aus und funktioniert offensichtlich nicht. Nach dem Code erscheint, wenn der Benutzer die Schaltfläche drückt, das aktuell ausgewählte Element in der Auswahlliste in das Listenfeld. Dann geht eine Art seltsamer Summierung vor, aber von dem, was Sie beschreiben, scheint es, Sie möchten das txtTotal Textfeld mit der Gesamtmenge aller "Pakete" aktualisieren, die in der listBox1 aufgelistet sind.

Wenn dies korrekt ist, dann müssen Sie diese Summe mit einer Variablen verfolgen und es scheint, Sie haben eine total genannt. Diese Variable muss aktualisiert und erneut angezeigt werden, wenn ein Element zur Liste hinzugefügt oder entfernt wird. Diese globale Variable zu jonglieren ist nicht schwierig, aber wirklich unnötig. Da der Gesamtpreis davon abhängt, welche Elemente in der Liste enthalten sind, kann es einfacher sein, eine Methode zu erstellen, die die Liste durchläuft und eine Summe aus allen Elementen im Listenfeld zurückgibt. Dadurch wird die globale Variable total nicht mehr benötigt und es handelt sich um eine Codezeile beim Hinzufügen oder Löschen von Elementen in der Listbox. Beispiel: Der folgende Code durchläuft alle Elemente im Listenfeld und gibt die Summe aller Elemente in der Liste zurück. Beachten Sie, dass der folgende Code DataTablePackagesData wie oben beschrieben verwendet, wobei Spalte 1 "Paket", Spalte 2 "Preis" und Spalte 3 "Beschreibung" ist. Alle Spalten sind Zeichenfolgen.

Drittens: Doppelklicken Sie auf ein Element im Listenfeld, um es zu entfernen und die Gesamtzahl zu aktualisieren. Auch dies verwendet eine DataTable und die obige Methode.

private void listBox1_DoubleClick(object sender, EventArgs e) { 
    int selectedIndex = listBox1.SelectedIndex; 
    if (selectedIndex >= 0) { 
    listBox1.Items.RemoveAt(selectedIndex); 
    txtTotal.Text = GetTotal().ToString(); 
    } 
} 

Ich hoffe, das macht Sinn und hilft. Wenn Sie eine Datentabelle mit den gewünschten Spalten erstellen, sollte dies die aktuellen Methoden vereinfachen und die Arbeit erleichtern. Sie können auch eine "Paket" -Klasse erstellen. Viel Glück