2017-03-12 16 views
-3

リストボックスにデータベース値を追加しようとしていて、doubleclickイベントを使用してリストアアイテムを削除しようとしています。リストボックス内のアイテムを削除したいのですが、そのアイテムの価格はtxtTotalに差し引かれます。テキスト。例えば。私はリストボックス名 "Package1"に299の価格で商品を追加し、300の価格で別の商品名 "Package2"を追加します。 "Package1"を削除すると、txtTotalは299の数を減らし、300になります。私は私があなたの供給コードに興味のあるいくつかのポイントを説明することを願って、私は道でMySQLを使用していリストボックスのアイテムを削除する方法C#

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(); 


    } 

、事前に感謝:)

答えて

0

は、ここに私のコードです。必ずしも間違っているわけではありませんが、不要でエラーが発生しやすいものがいくつかあります。私はこれらの不必要なコードスニペットの重大さから始めて指摘します。

まず、上記のコードは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; 

をご覧ください。ここでは、データベースに接続し、クエリ(私はdbinfo.tbladvanceの名前から推測している)に接続し、そのクエリのDataTableを使用して、 "名前"という名前の列の文字列でコンボボックスを埋めているようです。次に、接続が閉じられます。

これは一度だけ行う必要があると思われるので、これは問題ありません。コードcomboBox1_SelectedIndexChangedの次のメソッドに進みましょう。このイベントメソッドは、コンボボックスの選択が変更されるたびに発生します。

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; 

ここで、再びデータベースへの接続が開始されているようです。今度は照会で照合が行われ、comboBox1.Textはデータテーブルの列「Names」の文字列と一致します。これを行う理由は、選択したパッケージの価格と説明を取得する必要があるためです。情報がデータベースから返された後、これらの値は適切なテキストボックスに配置されます。次に、接続を閉じて終了します。

私はこれについて間違っている可能性がありますが、comboBox1_SelectedIndexChangedメソッドで考えられる問題は、ユーザーがコンボボックスの選択を変更するたびにデータベースを開いて閉じることです。コンボボックスの値のリストは変更されないため、これは不要です。

コードがデータベースにクエリを続ける必要があるのは、コードが最初のクエリを保存しないためです。 fillCombo()メソッドを見ると、コードがNamesという名前の列からこのデータを取得していることがわかります。 comboBox1_SelectedIndexChangedメソッドを見ると、このデータベースにはPriceDescriptionの2つの列があります。ユーザーがプログラムを使用している間にこのデータが静的であると仮定すると、データ(名前、価格、説明)をDataTableに保存すると、作業が簡単になるだけでなく、データベースへのクエリ数が1になります。

リアルタイムでデータが変更され、ユーザーがリアルタイムでこの新しい情報にアクセスする必要がある場合は、別の方法を検討することができますが、これは提供されたコードの場合とは異なります。

上記のヒントのポイントは、必要なデータをDataTableに読み込むことを検討することです。次に、DataTableを使用してクエリを実行します。これにより、データベースのオープンとクローズを継続する必要がなくなり、コードが不安定になります。

第2の:総費用:ボタンのクリック方法は謎めいており、明らかに機能しません。コードに続いて、ユーザーがボタンを押すと、コンボボックス内の現在選択されている項目がリストボックスに配置されるように見えます。それで何らかの種類の奇妙な合計が起こっていますが、listBox1に記載されているすべての「パッケージ」の合計量でtxtTotalテキストボックスを更新したいと思われる場合は、

これが正しい場合は、この合計を変数で追跡しなければならず、totalという名前があるように見えます。この変数は、項目がリストに追加または削除されるたびに更新および再表示する必要があります。このグローバル変数を扱うことは難しいことではありませんが、実際は不要です。合計金額は一覧に表示される項目に依存するため、リストをループしてリストボックス内のすべての項目から合計を返すメソッドを作成する方が簡単です。これにより、グローバルtotal変数を持つ必要がなくなり、リストボックス内の項目を追加または削除するときに1行のコードになります。例:以下のコードは、リストボックス内のすべての項目をループし、リスト内のすべての項目の合計を返します。以下のコードは、列1が「パッケージ」、列2が「価格」、列3が「説明」で、すべての列が文字列である上記のようにDataTablePackagesDataを使用しています。

private double GetTotal() { 
    double grandTotal = 0; 
    double curTotal = 0; 
    foreach (string curDesc in listBox1.Items) { 
    foreach (DataRow curRow in PackagesData.Rows) { 
     if (curRow.ItemArray[2] != null && curRow.ItemArray[1] != null) { 
     if (curDesc.Equals(curRow.ItemArray[2].ToString())) { 
      double.TryParse(curRow.ItemArray[1].ToString(), out curTotal); 
      grandTotal += curTotal; 
      break; 
     } 
     } 
    } 
    } 
    return grandTotal; 
} 

第3:リストボックスの項目をダブルクリックして削除し、合計を更新します。この場合も、DataTableと上記の方法を使用します。

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

これは意味があり、役立ちます。必要な列を持つデータテーブルを作成する場合は、現在のメソッドを整理してより簡単にする必要があります。また、 "パッケージ"クラスの作成を検討することもできます。幸運

関連する問題