C#-编辑列表框项目

C#-编辑列表框项目,c#,winforms,listbox,listboxitems,C#,Winforms,Listbox,Listboxitems,我正在用Windows窗体制作一个模拟销售点的应用程序。我现在正在创建一个部件,用户点击一个产品按钮,它会在列表框中添加一个类似这样的项目:“‘数量’-‘产品名称’-‘成本’” 再次单击按钮时,应编辑如下项目:“‘数量+1’-‘产品名称’-‘成本*2’”。 然而,它只是添加了另一个具有该信息的项目 到目前为止,我的代码如下: private void bprod1_Click(object sender, EventArgs e) { MySqlC

我正在用Windows窗体制作一个模拟销售点的应用程序。我现在正在创建一个部件,用户点击一个产品按钮,它会在列表框中添加一个类似这样的项目:“‘数量’-‘产品名称’-‘成本’”

再次单击按钮时,应编辑如下项目:“‘数量+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开始。GetPrec1是我从数据库中获得的值(产品成本)

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

我感谢你的建议和帮助。 希望你们理解我的意图。

这句话:

  listvenda.Items.Add(text1);            
这就是为什么你每次都会看到一个新项目。成熟的应用程序更可能使用
私有类
模型
方法

在同一名称空间中创建一个新的类文件,并将其命名为。见下文:

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()方法之类的方法,因为实际上可以用新类的列表填充listbox!它将在显示值时调用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;
List listvendaBind=new List();
///在此处插入代码以从数据库中生成列表(如果尚未创建)。否则,请跳过此步骤,以免覆盖列表
//现在修改代码
var x=listvendaBind.Where(t=>t.Name==newProduct.Name).FirstOrDefault();
如果(x.Count()>0&(x!=null)
listvendaBind[listvendaBind.IndexOf(x[0])].Quantity++;
其他的
listvendaBind.Add(新产品);
listvenda.DataSource=listvendaBind;

这是未经测试的,因为我目前正在从事另一个项目,但应作为概念证明。

这只是为了学习,我不建议在测试环境之外使用它,但您可以这样做:

插入

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);
bool notFound=true;

对于(int i=0;IIS是ASP.NET WebFras或Windows窗体?@ Guilherme WindowsFormsSQL注入警告。您可能想在此考虑参数化。您想要替换哪个项目?选择一个,最后一个?@ RossBush,您的意思是什么?请您解释一下吗?假设称为“名称”的变量。是我用button.Text替换的吗?我在“public override ToString()”上有一个错误。它说:“返回类型必须是'string'才能匹配被重写的成员'object.ToString()'”。你能告诉我如何修复这个错误吗?我在“.ToString(c,CultureInfo.CurrentCulture)”中有一个错误,因为它也不能识别“c”“CultureInfo”?如果您能帮助我,我将不胜感激。那是因为我打字错误。我没有在覆盖中包含键入内容。已修复。这不适合我的项目,因为我计划使用多个按钮,所有按钮都在同一个列表框中。但无论如何,谢谢!)@缩小17 Tiago和几个按钮与此代码有什么关系?我知道
bprod1
是一个按钮,但是如果你有多个按钮,你可以使用
sender
为所有按钮创建一个函数,或者在下一个函数中将名称更改为
bprod2
。在CDove asnwer中也是一样的。哦,好吧,忘了,我正在读用另一种方式编码,你是对的。