2015-02-20 3 views
0

Я довольно новичок в C# и получил небольшой проект для расширения. Код - это беспорядок, и я пытаюсь его каким-то образом улучшить, но, похоже, достигает некоторых пределов языка.Элементы пользовательского интерфейса C# в массиве

В основном я читаю значения датчиков от четырех датчиков и показываю некоторые из них на этикетках. Поскольку цикл всегда один и тот же, я хотел итерации вместо того, чтобы переписывать один и тот же код четыре раза с помощью только разных элементов GUI для хранения значений. Мои исследования показали мне, что я могу поместить свои метки в массив вручную, но редактор Visual Studio перезапишет это каждый раз, когда я что-то меняю в графическом интерфейсе. Поэтому мой подход заключался в создании массива ссылок на такие элементы, как

ref GroupBox[] gbChannel; 

, но это невозможно в C#. Если я попытаюсь назначить его напрямую

gbChannel[0] = gbChannel0; 

C# сообщает мне, что перед этим я должен проверить, является ли объект нулевым. Anyways,

if(gbChannel1!=null) gbChannel[0] = gbChannel0; 

приводит к такому же результату.

Есть ли какой-либо удобный способ достичь того, что я хочу сделать?

+0

'if (gbChannel1! = Null) gbChannel [0] = gbChannel0;' - это 'gbChannel1' просто опечатка или ваш фактический код выглядит также? –

+6

Не обижайтесь, но я думаю, вы достигли пределов своего знания C# *, а не * пределов языка *. Если вы публикуете больше кода и подробно рассказываете о проблемах, которые у вас есть, я уверен, что мы сможем помочь –

+0

Я предполагаю, что вы используете WinForms и помещаете код в созданный конструктором метод InitializeComponent. Тот, у кого есть комментарий, говорящий «не изменяйте содержимое этого метода с помощью редактора кода». – kjbartel

ответ

0

Я думаю, вы должны инициализировать свой массив;

GroupBox[] gbChannel = new GroupBox[x]; 
+2

Я думаю, что это наименьшая из проблем OP. И 'List <>' будет намного лучше, чем массив в любом случае. – kjbartel

+0

Конечно, List <> будет лучше, чем массив! – Galma88

0

Если вы не уверены в размере, вы могли бы иметь общий список, как:

List<Groupbox> gbChannels = new List<Groupbox>(); 

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

0

Я бы любопытно увидеть больше вашего кода реализации. Похоже, что вы не инициализируете свой массив правильно ... Есть несколько способов сделать это. Один из них упоминается Galma88, если вы знаете размер вашего массива.

GroupBox[] gbChannel = new GroupBox[x]; 

Другой путь будет выглядеть следующим образом:

GroupBox[] gbChannel = {gbChannel0, gbChannel1, gbChannel2, gbChannel3}; 

Большая часть этого зависит от объема переменных. Сообщение ozidom - хорошая идея подумать, так как дженерики могут быть очень гибкими.

0

Так что мой подход был создать массив ссылок на элементы, как

ref GroupBox[] gbChannel; 

GroupBox является reference type, вы вам уже есть массив ссылок. ref keyword разрешено указывать, что аргумент метода должен быть передан по ссылке. Это редко необходимо, так как большинство функций должно быть рассчитано на выход значения, а не mutate входы.

Если я пытаюсь присвоить его непосредственно

gbChannel[0] = gbChannel0; 

C# сообщает мне, что я должен проверить, если объект является пустым, прежде чем делать это.

Это потому, что вы не имеете массив еще - вы просто переменную, которая может держать массив. Вы должны создать массив с new:

gbChannel = new GroupBox[4]; 

или вы можете использовать инициализатор массива:

gbChannel = new [] {gbChannel0, gbChannel1, gbChannel2, gbChannel3}; 

редактор Visual Studio перезаписывает это каждый раз, когда я что-либо изменить в GU

Тогда вы делаете это не в том месте. Вероятно, вы добавили свой код в InitializeComponent, который зарезервирован для дизайнера для ввода кода, который соответствует установленным там элементам пользовательского интерфейса. Добавьте свой код в обработчик событий, например , который дизайнер не коснется,