如何解决一定数量的卖家不会堆叠
我在数据表中对卖家进行排序。如果卖家达到窗帘数量,它将显示“4级卖家数量为“X””。
如果我打印 if 语句的值,它就可以工作。我在所有级别的每个标签中都有 1 个销售员。
现在的问题是,如果另一个销售员的金额相同,则标签不会更新,并且仍然表明 1 个卖家达到了该金额。
foreach (DaTarow Drow in information.Rows)
{
int num = dataGridView1.Rows.Add();
dataGridView1.Rows[num].Cells[0].Value = Drow["Namn"].ToString();
dataGridView1.Rows[num].Cells[1].Value = Drow["Personnummer"].ToString();
dataGridView1.Rows[num].Cells[2].Value = Drow["distrikt"].ToString();
dataGridView1.Rows[num].Cells[3].Value = Drow["Antal artiklar"];
WhatLevel(salesman);
}
public void WhatLevel(Salesman sales)
{
int levelOne = 0;
int levelTwo = 0;
int levelThree = 0;
int levelFour = 0;
if (sales.AmountSold < 50)
{
levelOne++;
label8.Text = levelOne.ToString();
}
if (sales.AmountSold >= 50 && sales.AmountSold < 99)
{
levelTwo++;
label12.Text = levelTwo.ToString();
}
if (sales.AmountSold >= 100 && sales.AmountSold < 199)
{
levelThree++;
label13.Text = levelThree.ToString();
}
if (sales.AmountSold >= 199)
{
levelFour++;
label14.Text = levelFour.ToString();
}
}
解决方法
您已经在 WhatLevel 方法中定义了 4 个局部变量。这 4 个变量的范围仅限于该方法。此外,当方法被调用时,它们在递增之前总是被初始化为零。
您必须执行以下操作之一:
- 将 4 个级别* 变量改为字段。这将保留对 WhatLevel 的调用的价值。
- 如果 WhatLevel 方法仅在 foreach 循环中被调用,请将其内容直接移到循环中并完全避免使用单独的方法,然后将变量声明放在 foreach 循环之前。
我同意 Julius 的解决方案,但我想补充一些评论。 您不需要在每次迭代中更新 label.Text。您可以在循环结束时执行此操作。
基于单一职责规则,我认为最好添加一个属性或方法来从销售员类中获取级别。
最后使用一个集合来存储级别数,假设您有 10 或 20 个级别。
我建议这个解决方案
向推销员类添加新属性
public class Salesman
{
public int AmountSold { get; set; }
// Can be a method if you don't want to have property with a lot of code
public int Level
{
get
{
if (AmountSold < 50)
{
return 1;
}
if (AmountSold >= 50 && AmountSold < 99)
{
return 2;
}
if (AmountSold >= 100 && AmountSold < 199)
{
return 3;
}
// AmountSold >= 199
return 4;
}
}
}
更改实施
Dictionary<int,int> levelNumbers = new Dictionary<int,int>
{
{ 1,0 },{ 2,{ 3,{ 4,0 }
};
foreach (DataRow Drow in information.Rows)
{
int num = dataGridView1.Rows.Add();
dataGridView1.Rows[num].Cells[0].Value = Drow["Namn"].ToString();
dataGridView1.Rows[num].Cells[1].Value = Drow["Personnummer"].ToString();
dataGridView1.Rows[num].Cells[2].Value = Drow["Distrikt"].ToString();
dataGridView1.Rows[num].Cells[3].Value = Drow["Antal artiklar"];
levelNumbers[salesman.Level]++;
}
label8.Text = levelNumbers[1].ToString();
label12.Text = levelNumbers[2].ToString();
label13.Text = levelNumbers[3].ToString();
label14.Text = levelNumbers[4].ToString();
如果你想要更多的灵活性和可靠性,你可以使用 enum
public enum AmountSoldLevel
{
One,Two,Three,Four
}
在类中返回 AmountSoldLevel 而不是 int
public AmountSoldLevel Level
{
get
{
if (AmountSold < 50)
{
return AmountSoldLevel.One;
}
// ...
}
}
和初始化字典使用
Dictionary<AmountSoldLevel,int> levelNumbers = new Dictionary<AmountSoldLevel,int>();
foreach (AmountSoldLevel amountSoldLevel in Enum.GetValues(typeof(AmountSoldLevel)))
{
levelNumbers.Add(amountSoldLevel,0);
}
// ...
label8.Text = levelNumbers[AmountSoldLevel.One].ToString();
label12.Text = levelNumbers[AmountSoldLevel.Two].ToString();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。