Невозможно обновить ToolStrip с помощью файла класса

#.net #vb.net #controls #toolstrip

#.net #vb.net #элементы управления #toolstrip

Вопрос:

Вот простой пример того, что я делаю в реальном приложении

ФОРМА, СОДЕРЖАЩАЯ ОСНОВНОЙ ПОДРАЗДЕЛ OpenNew.vb

Шаг 1 — Main запрашивает пользователя для ввода с помощью диалогового окна в том же файле (OpenNew.vb) Шаг 2 — Пользователи выбирают, какой тип проекта они открывают, тип 1 или тип 2 Шаг 3 — strOpenNewResponse заполняется при закрытии диалога OpenNew Шаг 3 — Форма открывается на основе выбора

 Public Class OpenNew

    Public Shared strOpenNewResponse As String = Nothing

    Public Shared Sub Main()

        OpenNew.ShowDialog()

    If strOpenNewResponse IsNot Nothing Then

        Dim formToShow As Form = Nothing

        Select Case strOpenNewResponse
            Case "Type1"
                formToShow = New Form1
                formToShow.ShowDialog()
            Case "Type2"
                formToShow = New Form2
                formToShow.ShowDialog()
        End Select

    End If
End Sub
End Class
  

Form1 будет иметь строку состояния с одной ToolStrip и TreeView:

 Public Class Form1

Inherits Form

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    Utilities.DisplayStatus("Loading, Please Wait...")

    Me.Cursor = Cursors.WaitCursor

    PopulateTreeView("Root Node")

    Utilities.DisplayStatus("Process Complete")

    Me.Cursor = Cursors.Default

End Sub

End Class
  

Тогда файл класса называется Utilities.vb

 Public Class Utilities

Public Shared Sub DisplayStatus(ByVal strStatusMessage As String)

    Form1.toolstripDisplayStatus.Text = strStatusMessage
    Form1.toolstripDisplayStatus.Visible = True
    Form1.statusstripParent.Refresh()

End Sub

End Class
  

Когда я делаю это, элемент ToolStrip никогда не обновляется. Он просто остается значением по умолчанию.

Конечно, если я запущу его таким образом (без класса)

 Public Class Form1

Inherits Form

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    Me.Cursor = Cursors.WaitCursor

    toolstripDisplayStatus.Text = "Loading, Please Wait..."
    toolstripDisplayStatus.Visible = True
    statusstripParent.Refresh()

    PopulateTreeView("Root Node")

    toolstripDisplayStatus.Text = "Process Complete"
    toolstripDisplayStatus.Visible = True
    statusstripParent.Refresh()

    Me.Cursor = Cursors.Default

End Sub

End Class
  

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

Возможно, на данный момент я просто ослеплен очевидным

Кто-нибудь может дать мне представление о том, что может быть причиной этого?

ДОБАВЛЕН СКРИНШОТ для soohoonigan

введите описание изображения здесь

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

1. Когда вы используете класс utilities, я нигде не вижу ссылки на основную форму, которая передается ему. Ваш компилятор не выделяет текст «Form1» внутри этого класса?

2. Нет, просто указываю на Form1, как всегда

3. Как вы открываете свою форму? Вы открываете его самостоятельно или оно открывается как первая форма вашего приложения?

4. В реальном приложении он открывается с помощью ShowDialog ()

5. Я не могу сказать вам, почему, но formToShow = Form1 будет работать (удалите New )

Ответ №1:

formToShow = Form1 будет работать (удалите новый)

Ваш класс Utilities напрямую ссылается на Form1, но у вас есть только его экземпляр. В качестве альтернативы, если вам нужно несколько экземпляров Form1, вы можете передать форму в подраздел следующим образом:

 Public Shared Sub DisplayStatus(ByVal temp As Form1, ByVal strStatusMessage As String)

    temp.toolstripDisplayStatus.Text = strStatusMessage
    temp.toolstripDisplayStatus.Visible = True
    temp.statusstripparent.Refresh()

End Sub
  

и назовите это так:

 Utilities.DisplayStatus(Me, "Loading, Please Wait...")
  

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

1. Еще раз спасибо, это будет очень полезно

2. @mreinsmith Добро пожаловать. Теперь вы понимаете, почему он не работал так, как вы его закодировали?

3. Я полагаю, что при создании НОВОГО объекта formToShow мне пришлось бы ссылаться на это вместо form1

4. Частично, за исключением того, что formToShow будет вне области видимости в классе, поэтому фактический экземпляр объекта form1, созданный formToShow, должен передать себя утилитам.