группа CheckBox. Как выбрать только 1

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

kosten
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.05.2012 (Вт) 12:32

группа CheckBox. Как выбрать только 1

Сообщение kosten » 22.05.2012 (Вт) 12:45

Надо сделать группу из трех флажков (Red, Green, Blue) типа CheckBox(именно checkbox). Чтобы по нажатию выбирался цвет рисуемого объекта.

Я новичек в C#. Пробовал вешать проверку на CheckStateChanged и на CheckChanged, галки лишние снимаются, но нажатая ставится только со второго раза. Подскажите.


Код: Выделить всё
private void checkBox3_EnabledChanged(object sender, EventArgs e)
        {
            if (this.checkBox1.Checked == true) this.checkBox1.Checked = false;
            if (this.checkBox2.Checked == true) this.checkBox2.Checked = false;
        }
[Viper] :: Используй тэг CODE!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.05.2012 (Вт) 14:35

1. Почему бы не применить RadioButton'ы просто?
2. EnabledChanged - это что-то не то.
3. CheckStateChanged и CheckChanged срабатывают не только на установку флажка, но и на снятие. Надо ещё проверять текущее состояние.

kosten
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.05.2012 (Вт) 12:32

Re: группа CheckBox. Как выбрать только 1

Сообщение kosten » 22.05.2012 (Вт) 18:20

В задании конкретно указаны CheckBox'ы. Тоже рад бы RadioButton'ы использовать.
Тьфу не тот код написал

Код: Выделить всё
private void checkBox1_CheckStateChanged(object sender, EventArgs e)
        {
            if (this.checkBox2.Checked == true) this.checkBox2.Checked = false;
            if (this.checkBox3.Checked == true) this.checkBox3.Checked = false;
                if (this.checkBox1.Checked == false) this.checkBox1.Checked = true; // если поставить эту строку, то после второго нажатия - уходит в цикл.

        }


Без третьей строки получается:
Нажимаем 1 кнопку - галочка есть
Нажимаем 2 кнопку - галочка с 1 снялась, но на вторую не поставилась.
Нажимаем опять 2 кнопку - голочка на 2 поставилась.и т.д. Какое свойство CheckBox проверить, чтобы "поставить галку".
[Viper] :: Используй тэг CODE!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.05.2012 (Вт) 20:04

Для любого числа CheckBox'ов:
Код: Выделить всё
  public partial class Form1 : Form
  {
    private List<CheckBox> Chks = new List<CheckBox>();

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      foreach(Control ctrl in this.Controls)
      {
        CheckBox chk = ctrl as CheckBox;
       
        if (chk != null)
        {
          Chks.Add(chk);
          chk.CheckedChanged += Chk_CheckedChanged;
        }
      }
    }

    private void Chk_CheckedChanged(object sender, EventArgs e)
    {
      CheckBox cur = sender as CheckBox;

      if (cur != null && cur.Checked)
        foreach (CheckBox chk in Chks)
          if(!object.ReferenceEquals(chk, cur))
            chk.Checked = false;
    }
  }
Можно выбрать 0 или 1 флажок.

Если про твой код, то надо присваивания для 1го и 2го обернуть в if, проверяющий, что третий установлен.

kosten
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.05.2012 (Вт) 12:32

Re: группа CheckBox. Как выбрать только 1

Сообщение kosten » 22.05.2012 (Вт) 20:52

Странно. Но ваш код у меня не заработал. а такое для каждого из CheckBox пошло. За что вам огромное спасибо.

Код: Выделить всё
private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox3 != null && checkBox3.Checked)
            {
                checkBox1.Checked = false;
                checkBox2.Checked = false;
            }
        }
[Viper] :: Используй тэг CODE!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.05.2012 (Вт) 21:20

kosten писал(а):Странно. Но ваш код у меня не заработал.

Мой код в Form_Load обрабатывает все CheckBox'ы лежащие непосредственно на форме. Если у тебя они лежат в другом контроле, то надо вместо this написать его. Или явно сложить эти CheckBox'ы в список и повесить на них обработчик.
Кроме этого, надо было убрать все твои обработчкики. Обработчики вешаются цепочкой, поэтому и знак +=, а не =.
Ты хоть предаставляешь, как он должен работать? ;)

kosten писал(а):а такое для каждого из CheckBox

Проверка на null - лишняя. Если только ты явно не присваиваешь null.
По сути, в моём коде она тоже лишняя, если предполагать, что обработчик может быть вызван только с CheckBox'ом в качестве sender'а.
Кстати, я ещё в первом сообщении написал "Надо ещё проверять текущее состояние." - как раз это и имел в виду.

kosten писал(а):За что вам огромное спасибо.

Не за что :)

PS: Используй тег [code] всё-таки.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.05.2012 (Вт) 21:55

Вот так можно сделать, чтобы в рамках каждой группы можно было выбрать не более одного CheckBox'а:
Код: Выделить всё
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      ModifyAllCheckBoxes(this);
    }

    private void ModifyAllCheckBoxes(Control parent)
    {
      foreach (Control ctrl in parent.Controls)
      {
        CheckBox chk = ctrl as CheckBox;

        if (chk != null)
          chk.CheckedChanged += Chk_CheckedChanged;

        ModifyAllCheckBoxes(ctrl);
      }
    }

    private void Chk_CheckedChanged(object sender, EventArgs e)
    {
      CheckBox cur = sender as CheckBox;

      if (cur != null && cur.Checked)
        foreach (Control ctrl in cur.Parent.Controls)
          if (!object.ReferenceEquals(ctrl, cur))
          {
            CheckBox chk = ctrl as CheckBox;
           
            if(chk != null)
              chk.Checked = false;
          }
    }
  }

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: группа CheckBox. Как выбрать только 1

Сообщение Viper » 23.05.2012 (Ср) 4:50

kosten писал(а):В задании конкретно указаны CheckBox'ы.
В каком таком задании? Это что контрольная или курсовик какой? До пояснений тему закрываю.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList