【问题标题】:How to iterate over multiple elements of numericupdown如何迭代numericupdown的多个元素
【发布时间】:2021-01-20 18:57:39
【问题描述】:

我是 c# 新手,我有几个 numericupdown 元素,我想在循环中使用这是我所做的,我还尝试了其他一些东西,例如 foreach。

private void AffecteValeurBinaire(int valeur)
        {
            nudBinaire3.Value = valeur % 2;
            valeur >>= 1;
            nudBinaire2.Value = valeur % 2;
            valeur >>= 1;
            nudBinaire1.Value = valeur % 2;
            valeur >>= 1;
            nudBinaire0.Value = valeur % 2;
        }

我想把上面的代码变成一个循环,这就是我在上面所做的

private NumericUpDown[] nudBinaire = new NumericUpDown[] {nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 };
        private void AffecteValeurBinaire(int valeur)
        {
            for (int i = 3; i >= 0; i++)
            {
                nudBinaire[i].Value = valeur % 2;
                valeur >>= 1;
            }

        }
   

private void nudDecimal_ValueChanged(object sender, EventArgs e)
    {
        if (radDecimal.Checked)
        {
            nudHexadecimal.Value = nudDecimal.Value;
            AffecteValeurBinaire(Convert.ToInt32(nudDecimal.Value));
            Affiche7Segments(Convert.ToInt32(nudDecimal.Value));
        }

    }
    private void nudBinaire_ValueChanged(object sender, EventArgs e)
    {
        if (radBinaire.Checked)
        {
            decimal v = (nudBinaire0.Value * 8) + (nudBinaire1.Value * 4) +
            (nudBinaire2.Value * 2) + (nudBinaire3.Value);
            nudDecimal.Value = v;
            nudHexadecimal.Value = v;
            Affiche7Segments(Convert.ToInt32(nudDecimal.Value));
        }

    }
    private void nudHexadecimal_ValueChanged(object sender, EventArgs e)
    {
        if (radHexadecimal.Checked)
        {
            nudDecimal.Value = nudHexadecimal.Value;
            AffecteValeurBinaire(Convert.ToInt32(nudHexadecimal.Value));
            Affiche7Segments(Convert.ToInt32(nudDecimal.Value));
        }
    }
    
    private void radDecimal_CheckedChanged(object sender, EventArgs e)
    {
        if (radDecimal.Checked == true)
        {
            nudDecimal.Enabled = true;
        }
    }
    private void radBinaire_CheckedChanged(object sender, EventArgs e)
    {
           nudBinaire0.Enabled = nudBinaire1.Enabled = nudBinaire2.Enabled = nudBinaire3.Enabled = radBinaire.Checked;
    }

    private void radHexadecimal_CheckedChanged(object sender, EventArgs e)
    {
        nudHexadecimal.Enabled = radHexadecimal.Checked;
    }

** 我收到此错误: 字段初始值设定项不能引用该字段**

【问题讨论】:

  • for 循环看起来很有问题。从 3 点开始,到 4 点,一直持续下去。
  • 不应该像下面这样循环吗? for (int i = 3; i >= 0; i--) { nudBinaire[i].Value = valeur % 2;价值 >>= 1; }
  • @Nantharupan ,是的,我犯了一个错误,但它不起作用,这些是用窗体设计创建的对象

标签: c# .net visual-studio winforms


【解决方案1】:

错误文本说你不能用另一个变量初始化一个非静态变量。

因此,您不能使用变量nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 声明nudBinaire。您可以使用全局未知变量对其进行初始化。喜欢:

private NumericUpDown[] nudBinaire = new NumericUpDown[4];

然后用nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 声明的变量将它声明为另一个函数中(比如在包含循环的 void 中)。

或者您可以同时创建 nudBinairenudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 静态变量。

【讨论】:

  • 谢谢,但它会包含我用 windows 窗体设计创建的 numeriUpDown 类的对象吗?
  • 你应该在 void 中声明一个 nudBinarie 的实例,就像包含循环的 void 一样
  • 我在修改 System.NullReferenceException 时出现此错误:'对象引用未设置为对象的实例。'
  • 发布新代码。或尝试@jdweng 的答案(就像我说的 - 使变量静态)
  • 他在这些对象已经存在的情况下创建新对象,我将修改我的主题以添加这些对象的功能
【解决方案2】:

以下没有给出错误:

    public class Test
    {
        static NumericUpDown nudBinaire0 = new NumericUpDown();
        static NumericUpDown nudBinaire1 = new NumericUpDown();
        static NumericUpDown nudBinaire2 = new NumericUpDown();
        static NumericUpDown nudBinaire3 = new NumericUpDown();

        //private void AffecteValeurBinaire(int valeur)
        //{
        //    nudBinaire3.Value = valeur % 2;
        //    valeur >>= 1;
        //    nudBinaire2.Value = valeur % 2;
        //    valeur >>= 1;
        //    nudBinaire1.Value = valeur % 2;
        //    valeur >>= 1;
        //    nudBinaire0.Value = valeur % 2;
        //}

        private NumericUpDown[] nudBinaire = new NumericUpDown[] { nudBinaire3, nudBinaire2, nudBinaire1, nudBinaire0 };
        private void AffecteValeurBinaire(int valeur)
        {
            for (int i = 3; i >= 0; i++)
            {
                nudBinaire[i].Value = valeur % 2;
                valeur >>= 1;
            }

        }
    }

【讨论】:

  • 好的,我会尝试,但它不会修改我使用窗体设计创建的 umeridupdown 对象
  • 你在这些对象已经存在的情况下创建新对象,我将修改我的主题以添加这些对象的功能
  • 我所拥有的静态项目需要在表单中(在 Designer.cs 文件中声明)或添加到您的代码中。您的数组对象需要这些属性。
【解决方案3】:

您可以尝试将nudBinaire 声明为全局变量,但在方法中对其进行初始化(如Form1_Load)。

// declare as a global variable
NumericUpDown[] nudBinaire;

private void Form1_Load(object sender, EventArgs e)
{
    // initialize nudBinaire
    nudBinaire = new NumericUpDown[] { nudBinaire3, nudBinaire2, nudBinaire1, nudBinaire0 };
}

private void AffecteValeurBinaire(int valeur)
{
    for (int i = 3; i >= 0; i--)
    {
        nudBinaire[i].Value = valeur % 2;
        valeur >>= 1;
    }

}

private void button1_Click(object sender, EventArgs e)
{  
    // test
    AffecteValeurBinaire(100);
}

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多