如何删除列表框中的项目c#

时间:2017-03-12 20:38:46

标签: c#

我尝试使用数据库值添加列表框中的项目,并尝试使用双击事件删除它,我想删除列表框中的项目,该项目的价格将扣除到txtTotal.Text。例如。我在列表框名称中添加了一个项目" Package1"价格为299并添加另一个项目名称" Package2"价格为300,如果我删除" Package1&#34 ;,则txtTotal将减少299的数量,它将变为300.

这是我的代码:

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


    }

我顺便使用mysql,提前致谢:)

1 个答案:

答案 0 :(得分:0)

我希望我能解释您提供的代码中的一些兴趣点。有几件事情不一定是错的,但不必要且容易出错。我将从每个不必要的代码片段的严重性开始指出这些。

首先,请看下面的行......

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;

上面的代码是fillCombo方法。在这里,您似乎正在连接并查询(DataTable我从名称dbinfo.tbladvance猜测)数据库并使用该查询中的DataTable来填充组合框中的字符串来自一个名为“Names”的列。然后关闭连接。

这很好,因为人们会认为你只需要这样做一次。现在让我们继续讨论代码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。假设这个数据在用户使用程序时是静态的,那么将数据(名称,价格,描述)保存到DataTable会使事情变得更容易,但会将对数据库的查询数量减少到一个( 1)。

如果数据实时变化且用户需要实时访问这些新信息,那么您可能需要考虑不同的方法,但是从提供的代码中看似不是这样。

上述讨论的重点是,您应该考虑将所需数据读入DataTable。然后使用此DataTable来执行查询。这将消除保持打开和关闭数据库的需要,并将整理代码。

第二:总成本:按钮点击方法看起来很神秘,显然不起作用。在代码之后,看起来当用户按下按钮时,组合框中当前选择的项目被放入列表框中。然后会出现某种奇怪的总计,但根据您的描述,您似乎想要使用txtTotal中列出的所有“包”的总金额更新listBox1文本框。

如果这是正确的,那么您必须使用变量跟踪此总计,并且看起来您有一个名为total的人。只要将项目添加到列表或删除,就需要更新并重新显示此变量。玩弄这个全局变量并不困难,但实际上并不是必需的。由于总价格取决于列表中的项目,因此可能更容易创建循环列表并从列表框中的所有项目返回总计的方法。这将消除对全局total变量的需要,并且在添加或删除列表框中的项目时将是一行代码。示例:下面的代码循环遍历列表框中的所有项目,并返回列表中所有项目的总和。请注意,下面的代码使用DataTable PackagesData,如上所述,其中第1列为“Package”,第2列为“Price”,第3列为“Description”,所有列均为字符串。

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;
}

第三步:双击列表框中的项目将其删除并更新总计。这又使用了DataTable和上面的方法。

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

我希望这是有道理和有帮助的。如果使用所需的列创建数据表,则应该整理当前方法并使事情变得更容易。您也可以考虑制作一个" Package"类。祝你好运