繁体   English   中英

C#-编辑列表框项目

[英]C# - Editing Listbox Items

我正在用Windows Forms制作一个模拟销售点的应用程序。 我现在正在创建用户单击产品按钮的部分,它将在项目中添加如下项目:“'数量'-'产品名称'-'成本'”。

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

我的目标是,第二次单击等时,增加数量并增加成本,而无需创建新项目。 我可以删除该项目,然后再添加一个包含新信息的项目,但我希望该项目与其他项目位于同一位置,而不是在列表的末尾。

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

这行:

  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;

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

这仅用于学习,我不建议在测试环境之外使用它,但是您可以执行以下操作:

的插入

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解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM