2013-05-05 2 views
-2

Возьмем такой пример:Переменные сохраняются, когда форма закрывается?

У меня есть LoginForm и когда я ввожу свои учетные данные в текстовое поле и нажмите кнопку Go его направляет меня к моей главной HomeForm. В этом случае он сохраняет текущий текст пользователя от пользователя Textbox в регистрационной форме в Public Variable в HomeForm называется CurrentUser Так что мой код выглядит так:

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
Home.CurrentUser = UsernameTextBox.text 
End Sub 

Когда я затем попытаться получить доступ к информации, хранящейся в переменной у меня нет проблем, просто я хочу знать, закрывает ли пользователь HomeForm, будет ли переменная по-прежнему равна предыдущему значению до того, как пользователь закроет форму. И если не так, как бы вы порекомендовали сохранить. Я не хочу использовать потоковые считыватели/писатели из-за ненужных текстовых файлов.

Любая помощь очень ценится!

ответ

3

Если вы объявляете CurrentUser, как Shared тогда он будет держать значение даже тогда, когда форма закрыта, а затем вновь открыт (предполагается, что все приложение не закрыто):

Public Class HomeForm 

    Public Shared CurrentUser As String 

End Class 

Access это используя имя формы:

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
    HomeForm.CurrentUser = UsernameTextBox.text 
End Sub 

* Если вы смотрите на сохранение этого значения через запуска приложения, а затем добавить «CurrentUser» значение в проекте -> Свойства -> Настройки, а затем использовать код, как:

Private Sub btnOK_Click(sender As System.Object, e As System.EventArgs) Handles btnOK.Click 
    My.Settings.CurrentUser = UsernameTextBox.text 
    My.Settings.Save() 
End Sub 

Вы можете получить значение из любого места с помощью: My.Settings.CurrentUser

+2

'CurrentUser' сохранит свое значение, даже если это не *' Shared', если только тот же экземпляр 'HomeForm' доступен. –

+1

Вы должны действительно понимать последствия общих объектов перед их использованием. Они работают аналогично глобальным и редко являются хорошим местом для хранения информации. – Basic

+0

Согласен; до тех пор, пока вы получаете доступ к ** тому же ** экземпляру. Подход ** Shared ** будет работать, даже если этот экземпляр будет удален. Он также дает хорошую переменную _global_, доступ к которой можно получить из ** в любом месте ** без необходимости передавать ссылку. Все это зависит только от того, как вы планируете использовать это значение. Я полагаю ... =) –

0
Dim onearray() As String 
Dim i As Integer 
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
Home.CurrentUser = UsernameTextBox.text 
Home.CurrentUser = onearray(i) 
i = i + 1 
End Sub 
+0

Уход за разъяснением? – Neolisk

0

Это зависит от того, как вы вызываете свою форму из формы входа в систему, которую вы описали. Вызов метода show методом будет удалять форму после того, как пользователь закроет форму. Пожалуйста, см. Комментарии ниже для объяснений и поведения, которые могут возникнуть.

Согласно MSDN The Closing event возникает при закрытии формы. Когда форма закрыта, все ресурсы, созданные внутри объекта, освобождаются и форма удаляется.

На основании дальнейшего изучения можно прочесть простую переменную, даже если форма расположена. Однако, на мой взгляд, я хотел бы сэкономить необходимые данные, передав объект или переменную, как описано ниже.

Существует несколько способов сохранения или сохранения информации текущего пользователя, чтобы безопасно получить к ней доступ позднее. Вот один.

  1. Создайте класс под названием CurrentUser и дайте ему основные общедоступные свойства, которые вы можете получить и установить.
  2. Добавить новый конструктор в HomeForm и передать ссылку аргумента byref нового объекта CurrentUser.
  3. Установить или получить любую информацию, необходимую для объекта CurrentUser
  4. Когда форма закрывается, вы получите информацию, необходимую для объекта CurrentUser, переданного в форму. Обеспечьте, чтобы объем этого объекта был доступен для других частей вашего приложения по мере необходимости. (Т.е. сделать его общественным достоянием в форме, которая вызывает Home форму.)

    dim ouser as new CurrentUser 
    dim frmHomeForm as new HomeForm(ouser) 
    frmHomeForm.show 
    msgbox(ouser.Name) 
    

Если вы хотите сохранить значение после того, как пользователь закрывает приложение, то вы можете добавить параметр в свойствах проекта , а просто ссылайтесь на My.Settings.YourSettingName вместо того, чтобы использовать переменную для получения и установки имени пользователя для пользователей.

+1

Все это неправильно. Когда форма закрыта, она не освобождается и не удаляется. Все свойства доступны до тех пор, пока форма не будет удалена, что произойдет в случайный момент, учитывая код в этом ответе. Именно поэтому вы используете 'Using' при работе с формами для управления моментом утилизации:' Использование f Как новый LoginForm: f.ShowDialog(): MsgBox (f.AProperty): End Using'. 'AProperty' доступен, несмотря на закрытие формы. – GSerg

+0

@GSerg: Даже после того, как форма была удалена (с помощью метода 'Dispose'), пользовательские свойства или поля, такие как поле CurrentUser, будут сохраняться. –

+0

@ O.R.Mapper Технически да, хотя на самом деле они перестают работать, потому что чаще всего они исследуют свойства элементов управления формы, которые теперь вызывают 'DisposedException'. – GSerg

2

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

Это относится к любым полям или свойствам, которые не имеют доступа к каким-либо унаследованным свойствам или методам класса Form. Такие методы на основе Form могут зависеть от внутренних ресурсов, которые действительно освобождаются при закрытии или удалении формы, тогда как простые свойства CLR остаются нетронутыми до тех пор, пока экземпляр находится в пределах области действия.

+0

Будет ли удушающий мозг объяснить, в чем причина нисходящего движения? –

+0

Извините, подумайте, чтобы сложно ответить на этот вопрос. Предполагается, что область HomeForm всегда доступна или глобальна. Независимо от того, ваш ответ имеет смысл для вопроса. Это не позволит мне продвинуться, если вы не разместите там редактирование. – SoftwareCarpenter

+0

В любом случае вы можете поместить пробел или что-то в свой ответ, чтобы я изменил его на верхний угол? – SoftwareCarpenter

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