#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);
}