#.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, должен передать себя утилитам.