Ответ 1
Убедитесь, что ваши радиообъекты НЕ являются первым элементом tabindex = 0. Сделайте кнопку OK tabindex = 0, за которой следуют радиокнопки.
Похоже на вопрос Noobie, но я не могу помешать моей форме проверять одну из радиокниг в моей Group Box
:
Как показано в конструкторе, там не указаны Радио кнопки.
Ниже приведен всего лишь код для этой простой формы. Ничто не требует проверки Радио кнопок здесь или в дизайнере формы.
Q: Есть ли способ предотвратить блокировку любой Радио кнопки при загрузке формы?
public ValueTypeSelector() {
InitializeComponent();
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
radioButton5.Checked = false;
radioButton6.Checked = false;
button1.Enabled = false;
button1.Click += clickEvent;
button2.Click += clickEvent;
radioButton1.Click += clickEvent;
radioButton2.Click += clickEvent;
radioButton3.Click += clickEvent;
radioButton4.Click += clickEvent;
radioButton5.Click += clickEvent;
radioButton6.Click += clickEvent;
}
void OnShow(object sender, EventArgs e) {
foreach (RadioButton rad in Controls) {
if (rad.Checked) {
Console.WriteLine("WTF?");
}
}
}
void clickEvent(object sender, EventArgs e) {
RadioButton rad = sender as RadioButton;
if (rad != null) {
if (rad.Checked) {
if (rad == radioButton1) {
DataType = TableDataType.Boolean; // <= HERE IS THE PROBLEM! FIRES ON FORM LOAD
} else if (rad == radioButton2) {
DataType = TableDataType.Character;
} else if (rad == radioButton3) {
DataType = TableDataType.DateTime;
} else if (rad == radioButton4) {
DataType = TableDataType.Decimal;
} else if (rad == radioButton5) {
DataType = TableDataType.Integer;
} else if (rad == radioButton6) {
DataType = TableDataType.String;
} else {
return;
}
button1.Enabled = true;
}
} else if (sender == button1) {
DialogResult = DialogResult.OK;
Close();
} else if (sender == button2) {
DialogResult = DialogResult.Cancel;
Close();
}
}
ОБНОВЛЕНИЕ: Проблема заключается в том, что при отображении формы проверяется radioButton1
:
if (rad == radioButton1) {
DataType = TableDataType.Boolean; // <= HERE IS THE PROBLEM! FIRES ON FORM LOAD
} else if (rad == radioButton2) {
Убедитесь, что ваши радиообъекты НЕ являются первым элементом tabindex = 0. Сделайте кнопку OK tabindex = 0, за которой следуют радиокнопки.
В режиме проектирования вы обнаружите, что для свойства AutoCheck установлено значение true. Просто превратите его в false. Он не будет проверяться до тех пор, пока вы не выберете его вручную во время выполнения.
Задайте TabStop=False
в свойствах.
Установите установленное состояние на значение false после загрузки формы. Поместите это в событие Shown и посмотрите, работает ли он.
Я думаю, что на самом деле это может быть ошибка в VS. Я использую 2010 SP1, но OP не упоминает, какую версию они используют.
Если бы одна и та же фантомность происходила в одном из моих приложений.
Изменена функция автоочистки для двух переключателей: False, встроено приложение. Теперь затронутые кнопки не были выбраны, но теперь были выбраны другие, ранее не затронутые.
Вернулся в код и повернул autocheck в true на исходные кнопки, а затем переключился с true на false и обратно на вновь затронутые кнопки. Re побежал, и приложение было в порядке; кнопки не выбраны.
Когда я впервые проверил tabIndexes для исходных переключателей, они были установлены на tabIndex 0; который я изменил, так что он также может быть частью микса.