GlueStack
@GlueStack
Программист самоучка

Как использовать массив имён объектов?

Столкнулся со следующей проблемой. В моём проекте около сотни чекбоксов и нужно было бы как то сохранить данные из чекбоксов (1 или 0). Мне пришло в голову засунуть в массив все названия объектов. Теперь стоит задача как вытащить из массива значение так, чтобы элемент в массиве числился как имя объёкта.
код которым я создал массив:
public string MASSIVE;
public string[] cikl;
 private void Form1_Load(object sender, EventArgs e)

  {
        string first = "CheckBox";
        for (int i = 1; i < 96; i++)
   {
        MASSIVE = MASSIVE + (first + i + ",");
   }
        cikl = (GOD_MASSIVE.Split(','));
 }

Вот, а сейчас стоит задача сделать примерно такой код:
private void Button1_MouseClick(object sender, MouseEventArgs e)
{ 
  string save;       
  for (int i = 0; i<cikl.Length; i++)
{
  if(cikl[0].checked == true)
{
  save = save + ( 1 + ",");
}
else
{
   save = save + ( 0 + ",");
}               
}
}

У кого есть идеи как воссоздать этот код?
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
@fan92rus
Создаем чекбоксы на основе имен и подписываемся на событие, при его возникновении вызываем нужный метод с именем.
private void Form1_Load(object sender, EventArgs e)
        {
            string[] names = { "first", "second", "threes" };
            int yPosition = 33;
            foreach (var name in names)
            {
                var checkBox = new CheckBox() { Location = new Point(101, yPosition), Text = name, };

                checkBox.Click += (o, args) => { this.Select(name); };
                this.Controls.Add(checkBox);
                yPosition += 22;
            }
        }

        public void Select(string name)
        {
            MessageBox.Show(name);
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hePPer
@hePPer
можно с помощью рефлексии
private void button1_Click(object sender, EventArgs e)
        {
            var fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic |
                                                BindingFlags.Instance).Where(w => w.FieldType == typeof(CheckBox))
                .Select(s => ((CheckBox)s.GetValue(this)).Name + "=" + ((CheckBox)s.GetValue(this)).Checked)
                .ToList();

            var fileContent = string.Join(",", fields);

            File.AppendAllText("config.txt", fileContent);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if(!File.Exists("config.txt")) return;
            var fileContent = File.ReadAllText("config.txt");
            var fieldsValues = fileContent.Split(',');
            var fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic |
                                                  BindingFlags.Instance).Where(w => w.FieldType == typeof(CheckBox)).ToList();

            foreach(var field in fieldsValues)
            {
                var data = field.Split('=');
                var name = data[0];
                var value = bool.Parse(data[1]);
                var fieldObj = fields.FirstOrDefault(f => f.Name == name);
                if(fieldObj != null)
                {
                    var checkBox = (CheckBox)fieldObj.GetValue(this);
                    checkBox.Checked = value;
                }
            }
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы