Формы, сохраняющие значения после закрытия - PullRequest
3 голосов
/ 04 января 2011

Во всей нашей программе формы открываются следующим образом:

FormName.SomeValue = 10
FormName.ShowDialog()

вместо обычного

Dim myForm As New FormName
myForm.SomeValue = 10
myForm.ShowDialog()

(Мы ничего не могли с этим поделать - это быловыполняется автоматически Visual Studio VB6 -> конвертер VB.Net)

Проблема заключается в том, что когда формы закрыты, они на самом деле не закрываются, а только скрываются - если я добавлю некоторый текст втекстовое поле и закройте / снова откройте форму, текст все еще там, а не текстовое поле очищается, как обычно.Это возможно потому, что форма всегда использует один и тот же экземпляр.

Есть ли простой способ исправить это , кроме как через всю программу и создание нового экземпляра формы для каждого ShowDialog()call (их сотни) ?

Мы рассматривали возможность сброса каждого элемента управления в событии Load каждой формы, но это все равно было бы проблемой, поэтому мы решили, что спросим, ​​есть лисначала проще.

Ответы [ 6 ]

4 голосов
/ 04 января 2011
public class MyForm: Form{

   private static MyForm myForm = null;

   public static DialogResult ShowDialog(bool newForm){
          if(newForm)
          {
                if(myForm != null) 
                    myForm.Dispose();
                myForm= new MyForm();
          }
          return myForm.ShowDialog();
   }

   public static DialogResult ShowDialog(){
          return ShowDialog(true);
   }
}
2 голосов
/ 07 января 2011

То, с чем вы имеете дело, называется «экземпляром по умолчанию» формы и переносится с дней VB6. Не рекомендуется использовать его. Возможно, вы не захотите это слышать, но лучшая долгосрочная стратегия для вашей базы кода - переписать инициализаторы формы правильным способом, чем сделать какой-нибудь хакерский обходной путь в событиях формы Load (). Вы можете ненавидеть это сейчас, но вы оцените это в следующий раз, когда вам придется работать над этим кодом. Вы, вероятно, даже можете собрать фрагмент, чтобы выполнить большую часть печати за вас.

1 голос
/ 17 августа 2017

Я знаю, что это очень поздно, но ... 1001

Form1.Dispose()
1003 * работает для меня.Сбрасывает текстовые поля.
1 голос
/ 09 февраля 2015

Вы попросили простой способ исправить это:

Измените ShowDialog() вызовы процедур / функций следующим образом:


   AS PROCEDURE                       |   AS FUNCTION
                                      | 
    FormName.ShowDialog()             |    r = FormName.ShowDialog()
    FormName.ShowDialog()             |    r = FormName.ShowDialog()
                                      |
   CHANGE TO                          |   CHANGE TO
                                      |
    Call New FormName.ShowDialog()    |    r = New FormName.ShowDialog()
    Call New FormName.ShowDialog()    |    r = New FormName.ShowDialog()

1 голос
/ 04 января 2011

Редактировать: Как отобразить форму с помощью оператора Using

Using formName AS New FormName
    formName.SomeValue = 10
    formName.ShowDialog()
End Using

Из кода, показанного здесь, видно, что теперь к вашему FormName добавлен вызов static ShowDialogучебный класс.Вы должны иметь возможность отредактировать только этот метод для dispose старой формы и создать и отобразить новую.Это поможет вам избежать изменения кода везде, только в одном месте.

0 голосов
/ 04 января 2011
  1. Если вопрос касается очистки текстовых полей, то я бы очистил все из них РЕКУРСИВНО

      For Each Control in Controls
          If Control is type of TextBox
          Control.Clear
      Next
    
  2. Если вы связываете элементы управления любым DATASOURCE Iпредложил бы очистить источник данных и REBIND

  3. Переопределить метод ShowDialog ().
...