我在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是我从数据库中获得的值(产品成本)。
我的目标是,当第二次点击时,等等,增加数量并增加成本而不创建新项目。 我可以删除该项目并使用新信息添加另一项,但我希望该项目与另一项目位于同一位置,而不是列表末尾。
我感谢任何建议和帮助。 希望你们明白我打算做什么。
答案 0 :(得分:1)
这一行:
listvenda.Items.Add(text1);
是您每次都看到新商品的原因。成熟的应用程序更有可能使用private class
或Model
方法。
在同一名称空间中创建一个新的类文件并调用它。见下文:
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