2016-04-15 4 views
0

У меня возникла странная проблема ... У меня две формы (Form1 & Form2). Form1 вызывает старое имя (строка), и пользователь вводит новое имя (textbox1) в Form2, которое возвращается Form1. Все работает нормально, если они вводят значение или отменяют ... однако я хочу поставить проверку ошибок, чтобы они, помимо прочего, ввели значение. Проверка ошибок работает нормально, но после ошибки, когда введено правильное значение, form2 закрывается, но ничего не происходит. Я положил некоторые точки останова, и Form1, похоже, удерживает оператор using (form2 ...), ожидая завершения Form2, но после запуска сообщения об ошибке ничего не происходит. Если я удалю ... Form2 F2 = new Form2 ... Form2 просто закрывается и возвращается в Fomr1. В идеале я бы хотел остаться на Form2 до тех пор, пока значение не будет введено или пользователь не отменяет. Что мне не хватает?C# DialogResult с проверкой ошибок

// Form1 
using(Form2 F5 = new Form2(SelNm)) 
{ 
    if(F5.ShowDialog()== DialogResult.OK) 
    { 
     //Do stuff 
    } 
} 

// Form2 
public string newName { get; set; } 
public string oldName { get; set; } 

public Form2(string oldNm) 
{ 
    InitializeComponent(); 
    oldName = oldNm;  
} 

private void btnOK_Click(object sender, EventArgs e) 
{ 
    if (textbox1.Text.Length > 0) 
    { 
     newName = textbox1.Text; 
     DialogResult = DialogResult.OK; 
     Close(); 
    } 
    else 
    { 
     MessageBox.Show("ERROR: Must enter a new name."); 
     DialogResult = DialogResult.Cancel; 
     Form2 f2 = new Form2(oldName); 
     f2.Show(); 
     Close(); 
    } 
} 

ответ

2

Причина этого в том, что вы вызвали новый Form2 после отображения диалогового окна с ошибкой. Это не экземпляр Form2, который ожидает Form1. Вместо того, чтобы вызывать новый Form2, почему бы не повторно использовать текущий Form2?

Вместо этого:

MessageBox.Show("ERROR: Must enter a new name."); 
    DialogResult = DialogResult.Cancel; 
    Form2 f2 = new Form2(oldName); 
    f2.Show(); 
    Close(); 

Почему бы не это?

MessageBox.Show("ERROR: Must enter a new name."); 
    // Do not close the form so the user can 
    // input again 

Update:

Как было предложено на комментарии ..

private void textbox1_TextChanged(object sender, RoutedEventArgs e) 
{ 
    btnOK.Enabled = !string.IsNullOrWhiteSpace(textbox1.Text); 
} 
+0

Кроме того, я хотел бы иметь чек, который отключает кнопку OK, если текст является недействительным. Эта проверка входит в обработчик TextChanged для текстового поля, а также для обработчика Show для формы. – smead

+0

Это лучший подход, который наиболее часто встречается на веб-страницах. @ ArtR45 обратите внимание на это. –

+0

Спасибо ... У меня обычно есть сообщение ... но когда я впервые установил это, я использовал свойства «DialogResult» вместо его настройки вручную. В любом случае в настоящее время отлично работает. Еще раз спасибо. Быстрый вопрос, мне нравится, что вы отключили идею кнопки OK, можете ли вы предоставить фрагмент кода? Я попытался сделать его «ложным» при загрузке формы, а затем «true» в событии textbox1_TextChanged ... но ничего не происходит. – ArtR45

Смежные вопросы