Как выполнить итерацию по нескольким элементам numericupdown

#c# #.net #visual-studio #winforms

#c# #.net #visual-studio #winforms

Вопрос:

Я новичок в 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;
    }
 

** Я получаю эту ошибку:
инициализатор поля не может ссылаться на поле**

Комментарии:

1. Цикл for выглядит довольно проблематично. Начинается с 3, переходит к 4 и продолжается вечно.

2. Разве цикл не должен выглядеть следующим образом? for (int i = 3; i >= 0; i—) { nudBinaire[i].Value = valeur % 2; valeur >>= 1; }

3. @Nantharupan, да, я допустил ошибку, но это не работает, это объекты, созданные с помощью дизайна Windows forms

Ответ №1:

В тексте ошибки говорится, что вы не можете инициализировать нестатическую переменную другой переменной.

Следовательно, вы не можете объявлять nudBinaire переменные nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 . Вы можете инициализировать его с помощью глобальных неизвестных переменных. Нравится:

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

а затем объявить его внутри другой функции (например, внутри void, содержащей цикл) с nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 объявленными переменными.

ИЛИ вы можете создать обе nudBinaire и nudBinaire3,nudBinaire2,nudBinaire1,nudBinaire0 статические переменные.

Комментарии:

1. Спасибо, но будет ли он содержать объекты класса numeriUpDown, которые я создал с помощью дизайна Windows forms?

2. вы должны объявить экземпляр nudBinarie внутри void, например void, который содержит цикл

3. У меня есть эта ошибка с этой системой модификации.Исключение NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’

4. Опубликуйте новый код. или попробуйте ответ @jdweng (как я уже сказал, сделайте переменные статическими)

5. он создает новые объекты, когда эти объекты уже существуют, я изменю свою тему, чтобы добавить функции этих объектов

Ответ №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;
            }

        }
    }
 

Комментарии:

1. Хорошо, я попробую, но не изменит ли это объект umeridupdown, который я создал с помощью window forms design

2. Вы создаете новые объекты, когда эти объекты уже существуют, я изменю свою тему, чтобы добавить функции этих объектов

3. Элементы, которые у меня есть как статические, необходимы либо в форме (которая объявлена в файле 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);
}