C# - 编辑列表框项

时间:2017-05-24 15:43:06

标签: c# winforms listbox listboxitems

我在Windows Forms中创建了一个模拟销售点的应用程序。我现在正在创建用户点击产品按钮的部分,它会在列表框中添加如下项目:"'数量' - '产品名称' - '费用'"。

当再次点击该按钮时,应该像这样编辑项目:"' Quantity + 1' - '产品名称' - '费用* 2'"。 但是,它只是添加了另一个包含该信息的项目。

到目前为止,我的代码如下:

private void bprod1_Click(object sender, EventArgs e)
    {            
        MySqlCommand cmdp1 = new MySqlCommand("SELECT preco_unitario FROM produtos where designacao='" + bprod1.Text + "';", mConn);
        mConn.Open();
        MySqlDataReader drp1 = cmdp1.ExecuteReader();
        drp1.Read();
        string getpreco1 = drp1["preco_unitario"].ToString();
        mConn.Close();
        quant1 = quant1 + 1;
        var preco1tot = quant1 * Convert.ToDecimal(getpreco1);
        var text1 = quant1.ToString() + " - " + bprod1.Text + " - " + preco1tot.ToString();
        listvenda.Items.Add(text1);            
    }

bprod1是我的按钮。 quant1以值0开头.getpreco1是我从数据库中获得的值(产品成本)。

我的目标是,当第二次点击时,等等,增加数量并增加成本而不创建新项目。 我可以删除该项目并使用新信息添加另一项,但我希望该项目与另一项目位于同一位置,而不是列表末尾。

我感谢任何建议和帮助。 希望你们明白我打算做什么。

2 个答案:

答案 0 :(得分:1)

这一行:

  listvenda.Items.Add(text1);            

是您每次都看到新商品的原因。成熟的应用程序更有可能使用private classModel方法。

在同一名称空间中创建一个新的类文件并调用它。见下文:

public class myProduct
{
    public int Quantity {get; set;}
    public int Name     {get; set;}
    public double Price {get; set;}

    public myProduct(string name)
    { 
      this.Quantity = 1; this.Name = name; this.Price = 0;
    }
    public override string ToString()
    {
      return this.Quantity.ToString() + "-" + this.Name + "-" + 
             (this.Price * this.Quantity).ToString(c, 
             CultureInfo.CurrentCulture);
    }
}

现在,您只需添加值,您可以检查该行是否存在,如果存在,则对其进行操作。否则,添加一个新行。不要使用ToString()方法等等,因为您实际上可以使用新类的列表填充列表框!它将在显示值时调用ToString()方法。

List<myProduct> listvendaBind = new List<myProduct>();

///insert code here to build your list from the database if you havent already.  Otherwise, skip this step so you dont overwrite your list

//now the code for modification
var x = listvendaBind.Where(t => t.Name == newProduct.Name).FirstOrDefault();

  if(x.Count() > 0 && (x != null)
         listvendaBind[listvendaBind.IndexOf(x[0])].Quantity++;
  else
         listvendaBind.Add(newProduct);

  listvenda.DataSource = listvendaBind;

这是未经测试的,因为我现在在另一个项目上工作,但应该作为概念的证明。

答案 1 :(得分:0)

这仅用于学习,我不建议在测试环境之外使用它,但你可以这样做:

的插入内容
listvenda.Items.Add(text1);

这样做:

bool notFound = true;
for(int i=0; i<listvenda.Items.Count; i++)
{ 
    if(((string)listvenda.Items[i]).Contains(" - " + bprod1.Text + " - "))
    {
        listvenda.Items[i] = text1;
        notFound = false;
        break;
    }
}

if(notFound)
    listvenda.Items.Add(text1);

但正如我所说,它应该只是暂时的解决方案。而不是使用CDove solution