微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一定数量的卖家不会堆叠

如何解决一定数量的卖家不会堆叠

我在数据表中对卖家进行排序。如果卖家达到窗帘数量,它将显示“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();

使用应用进行示例测试 sample winform apps

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。