Метод Windows Forms Form.ShowDialog() странное поведение

Я пытался показать форму (FormChild) с некоторыми переключателями, просто чтобы выбрать, закрыть и получить значение выбранного переключателя из вызывающей формы (FormParent). В обработчике события click для кнопки в FormParent я только что сделал:

var formChild=newFormChild();
formChild.ShowDialog(this);

Все работало отлично, пока я не решил обработать событие CheckedChanged одного из RadioButtons внутри FormChild:

private void SomeRadioButton_CheckedChanged(object sender, EventArgs e)
{
    Close();
}

Теперь formChild.ShowDialog(this); не показывал formChild, а formChild сразу возвращает DialogResult.Cancel.

Любое объяснение по этому поводу?

заранее спасибо


person Ramon Araujo    schedule 12.11.2013    source источник
comment
Вы должны установить DialogResult() вместо использования Close(). Кроме того, вы должны сделать это из обработчика кнопок, чтобы у пользователя была возможность изменить свой ответ. Что, если они нажмут не на ту RadioButton?... форма сразу же закроется, как только они сделают выбор, и у них не будет возможности изменить ее.   -  person Idle_Mind    schedule 12.11.2013
comment
@Idle_Mind, спасибо за ваш комментарий, не только это, но я действительно использую сейчас две кнопки (ОК и Отмена), и это AcceptButton и CancelButton FormChild. Но мой вопрос был именно при тех исходных обстоятельствах. Кроме того, теперь я просто обрабатываю событие Click OkButton и делаю: var rButton = MyGroupBox.Controls.OfType‹RadioButton›().FirstOrDefault(r =› r.Checked); Закрывать();   -  person Ramon Araujo    schedule 12.11.2013


Ответы (2)


Самая нижняя радиокнопка Tab Index будет отмечена по умолчанию. Если этот обработчик событий назначен этой кнопке, это вызовет ситуацию, которую вы описываете.

Вы можете либо изменить свой порядок вкладок, либо создать логический флаг, который установлен в обработчике событий Forms Shown EventHandler, чтобы он не запускался, пока вы не проверите его снова.

public partial class Form1 : Form
{
    bool initDone;
    public Form1()
    {
        InitializeComponent();
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (initDone)
        {
            if (((RadioButton)sender).Checked == true)
            {
                Close();
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        initDone = true;
    }
}
person Mark Hall    schedule 12.11.2013

Есть ли где-нибудь ваш код, который устанавливает значение RadioButton? Если вы программно установите свойство «Проверено» для RadioButton, оно вызовет событие.

В вашей ситуации обработчик событий содержит ваш Form.Close(), поэтому форма никогда не будет видна пользователю.

Примечание. Установка для параметра RadioButton.Checked значения «true» в конструкторе не приведет к запуску события.

person ImGreg    schedule 12.11.2013