Получение пароля с помощью DialogShow() не работает

Я пишу приложение WinForm в C#. E сть Form A что открывается Form C на Button нажмите кнопку. Теперь я хочу добавить экран ввода пароля Form B перед открытием Form C, Только если введенный пароль верный, Form C открыть, а в противном случае показать сообщение об ошибке. Form B просто есть TextBox контроль и проверка Button контроль.

/*Form A*/
FormB fb;
private void BtnClick(object sender, EventArgs e) {
    DialogResult result;
    //fb can open once at a time
    if(fb == null){
        fb = new FormB();
        fb.FormClosed += new FormClosedEventHandler(FormB_FormClosed);

        //This seems to be not working
        result = fb.ShowDialog();
    }
    else //FormB already open. Do nothing
        return;

    //Only if password entered is correct, proceed
    if(result == DialogResult.Yes){    //result == cancel 
        //Code to open Form C          //Program never reaches here
    }
}

//Upon closing FormB, reset it to null
private void FormB_FormClosed(object sender, FormClosedEventArgs e){
    if(fb != null)
        fb = null;
}

/* Form B */
private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e){
    bool result = Verify();
    if(result){
        BtnPW.DialogResult = DialogResult.Yes;
    }
    else{
        MessageBox.Show("Error: Incorrect password");
        BtnPW.DialogResult = DialogResult.No;
    }
    this.Close();             //Added
}

private bool Verify(){
    if(TxtBox.Text == password)
        return true;
    else
        return false;
}

Может кто-нибудь сказать мне, что не так с этим кодом? Это никогда не достигает второго if заявление в Form A,

Редактировать: даже если я введу правильный пароль и нажму кнопку Form B, result в Form A получает "DialogResult.Cancel`.

1 ответ

Решение

Если вы вызываете метод Form.Close, то для свойства DialogResult этой формы устанавливается значение DialogResult.Cancel, даже если для него установлено другое значение. Чтобы скрыть форму, открытую модально, вам просто нужно установить свойство DialogResult формы в любое значение, кроме DialogResult.None.

Сказал, что ваш код, кажется, не тот, который обычно используется для обработки модального диалога.
ShowDialog блокирует ваш код, вы не выходите из этого вызова до тех пор, пока вызываемая форма не будет закрыта или скрыта, поэтому вам не нужно хранить глобальную переменную FormB и обрабатывать обработчик события FormClosed для FormB в FormA.

private void BtnClick(object sender, EventArgs e) 
{
    using(FormB fb = new FormB())
    {
        // Here the code returns only when the fb instance is hidden
        result = fb.ShowDialog();
        if(result == DialogResult.Yes)
        {  
            //open Form C          
        }    
   }     
}

Теперь вы должны удалить вызов Form.Close в коде FormB и установить непосредственно свойство DialogResult для FormB, не пытайтесь изменить на этом этапе свойство DialogResult для кнопок, это не будет работать, и вам потребуется второй щелчок для скрыть форму, вместо этого установите непосредственно свойство DialogResult формы.

private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e)
{
     if(Verify())
         this.DialogResult = DialogResult.Yes;
     else
     {
         MessageBox.Show("Error: Incorrect password");
         this.DialogResult = DialogResult.No;
     }
}

Таким образом, форма скрыта (не закрыта), и ваш код выходит из вызова ShowDialog в FormA. Внутри блока using вы все еще можете использовать экземпляр FormB для чтения его свойств и выбора подходящих путей. Когда ваш код выходит из блока using, экземпляр fb автоматически закрывается и удаляется из существования.

Другие вопросы по тегам