как получить доступ к различным формам через цикл и изменить текст метки в vb.net

#vb.net #winforms #label

#vb.net #winforms #метка

Вопрос:

Я сделал vb.net заявка, состоящая из 63 форм. В каждой форме label2 должно быть указано имя пользователя, использующее приложение. Первая форма, отображаемая пользователю, — это форма входа. Когда пользователь нажимает кнопку входа в эту форму, имя пользователя во всех вновь открываемых окнах должно отображаться внутри label2 . Как я могу это сделать?

Ответ №1:

Если дизайн не требует наличия метки в каждой форме, вы можете рассмотреть возможность использования формы, являющейся контейнером MDI, в качестве основной формы, добавив строку состояния в нижней части этой формы и сохранив имя пользователя в одном из полей строки состояния.

Таким образом, информация о пользователе доступна в одном месте, о котором знает пользователь, вы не занимаете ценную область экрана с помощью метки, и вам не нужно беспокоиться о новых формах.

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

Например:

 Dim oLabel As Label

oLabel = TryCast(Me.Controls.Find("label2", True), Label)

If oLabel IsNot Nothing Then
  oLabel.Text = globalusername
End If
  

Ответ №2:

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

Редактировать:

Когда отображается ваша форма входа, у вас не открываются другие окна, поэтому для вашего приложения они не существуют (пока), и, следовательно, вы не можете перебирать их или изменять состояние.

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

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

При этом единственное, что вам нужно сделать, это поместить этот пользовательский элемент управления во все формы, которые должны отображать имя пользователя, а остальное работает автоматически. Для получения справки о том, как создавать пользовательские элементы управления, в Google есть много руководств, и это в основном похоже на создание формы.

Комментарии:

1. Форма входа — это первая форма, и одновременно отображается только одна форма… Функциональность, которую я хочу, — это просто отобразить имя пользователя в виде label.text, которое подписалось в приложении… Я хочу, чтобы текст метки был установлен во всех формах при входе пользователя в систему

2. Хорошо, я добавил некоторую информацию, которая может помочь вам в моем ответе. Я также немного отредактировал ваш вопрос, чтобы добавить информацию, которую вы мне только что сообщили, и облегчить другим понимание того, что вам нужно. Как только вы будете удовлетворены одним ответом, пожалуйста, отметьте его как принятый ответ. Это помогает другим с аналогичными проблемами и вознаграждает людей, которые помогли вам.

Ответ №3:

A. Я полностью согласен с aKzenT в отношении присвоения имен вашим элементам управления некоторого последовательного и легко узнаваемого способа. Одним из преимуществ наших современных быстрых машин является то, что мы можем использовать описательные имена в нашем коде для переменных и классов. 🙂

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

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

competent_tech находится на правильном пути, предлагая наследование. Сделав еще один шаг, вы можете использовать функцию My.Application для хранения вашей глобальной переменной. Перейдите в окно свойств вашего проекта / Приложение / Просмотр событий приложения. Вы увидите следующий файл кода. Добавьте указанный код:

 Namespace My

    Partial Friend Class MyApplication


        'Add THIS code block:
        Private _CurrentUserName As String = "Current User"
        Public Property CurrentUserName() As String
            Get
                Return _CurrentUserName
            End Get
            Set(ByVal value As String)
                _CurrentUserName = value
            End Set
        End Property

    End Class

End Namespace
  

Теперь ваша форма входа в систему может устанавливать переменную приложения следующим образом:

 Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    My.Application.CurrentUserName = Me.UsernameTextBox.Text
    'YOUR LOGIN CODE HERE . . .
    Me.Close()
End Sub
  

Не создавайте класс в модуле My.Application. Используйте Project / Add / New Class
Затем создайте НОВЫЙ класс (НЕ в модуле My.ApplicationEvents!) который наследуется от System.Windows.Формы.Обозначьте следующим образом:

 Public Class MyUserLabel
    Inherits System.Windows.Forms.Label

    Public Sub New()
        Me.Text = My.Application.CurrentUserName
    End Sub
End Class
  

Вам нужно будет создать проект, прежде чем элемент управления MyUserLabel будет виден на панели инструментов. После сборки элемент управления будет доступен для перетаскивания в ваши формы. Или вы могли бы использовать Поиск / замену с областью, установленной на «весь проект». Замените «label2» на «MyUserControl»

Приведенный выше код приведет к тому, что экземпляры MyUserLabel установят .Свойство Text для каждого экземпляра на значение, представленное My.Application.Переменная CurrentUser при инициализации (даже в режиме разработки).

Затем замените Label2 во всех ваших формах на MyUserLabel (вероятно, вы могли бы выполнить это с помощью поиска и замены, охватывающих весь проект).

Надеюсь, это поможет.

Вот код:

        Namespace My

' The following events are availble for MyApplication:
' 
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication

    'Add THIS code block:
    Private _CurrentUserName As String = "Current User"
    Public Property CurrentUserName() As String
        Get
            Return _CurrentUserName
        End Get
        Set(ByVal value As String)
            _CurrentUserName = value
        End Set
    End Property
    Public Class MyUserLabel
        Inherits System.Windows.Forms.Label

        Public Sub New()
            Me.Text = My.Application.CurrentUserName
        End Sub
    End Class


End Class
  

Конечное пространство имен

Комментарии:

1. я пробовал этот приведенный выше код, и после создания проекта я не вижу новый элемент управления в окне инструментов…. Я создал общедоступный класс в модуле с именем mod1….. А также я хочу упомянуть, что я использую специально созданную форму входа (разработанную мной) с двумя текстовыми полями и кнопкой входа

2. Посмотрите в списке ошибок. Успешно ли был собран проект? Нет причин, по которым MyUSerLable не должен отображаться в панели инструментов. Обычно в «Components» или «YourProjectNamespace Components» вместе со стрелкой выбора.

3. Кроме того, нет причин, по которым вы не можете использовать общедоступный модуль для своей глобальной переменной, хотя, опять же, я настоятельно рекомендую переименовать так, чтобы ваш код было легче использовать / поддерживать. Однако пространство имен My.Application является более логичным местом для его размещения . , ,

4. даже после размещения его в пространстве имен My.Application оно не отображается в toolbox

5. В прошлом у меня часто возникали подобные проблемы с Visual Studio. особенно более ранние версии. Я рекомендую вам удалить вашу версию 2005 и вместо этого установить Visual Basic Express 2010. В последних версиях есть много приятных дополнений, а экспресс-версия предлагает всю необходимую функциональность, особенно для новичков. Скачать бесплатно можно здесь: microsoft.com/express