Я заметил нечто очень неприятное с обработкой объектов Winform в VB.Net.
Это разрушило несколько часов нашего времени.Это будет только хуже, так как у нас будет больше наших программистов на VB6, которые привыкли делать такие вещи, и автоконвертированный код, который переносит конструкцию прямо из vb6.
Вот приемлемый способ сделать что-то:
Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
TheAnswer = FormInstance.TextBox1.Text
EndIf
Однако это позволяет:
If FormClassName.ShowDialog() = DialogResult.OK then
TheAnswer = FormClassName.TextBox1.Text
EndIf
Помните, что свойства и методы не являются общими.Превращение Application Framework не имеет значения.Кажется, что за кулисами VB создает глобальную копию формы и перенаправляет этот синтаксис в эту глобальную ссылку.Вы можете вообразить хаос, который это наносит современной программе!Часто разработчик добавит его, или мы пропустим очистку неясного кода от преобразования (да, я сейчас ищу это, так что это помогает).
Любая настройка, которую я могу сделать, чтобы вызвать этосообщение об ошибке, например, Reference to a non-shared member requires an object reference
, как это должно быть?
Вот решение:
Я выбрал ответ jmoreno, потому что он указал мне на виновника: My.Forms
.Исправить это было так же просто, как поместить это в модуль:
Namespace My.MyProject.MyForms
End Namespace
Тогда вы получите точную ошибку, о которой я упоминал выше.Так же, как вы должны.Если вам это нужно для устаревших приложений (что хорошо), не делайте этого!Я подумал, что Gserg может быть просто бить VB (забавно, но не полезно), но он сразу все это упомянул, и, поскольку я нашел ответ, мы снова хорошо понимаем, что vb не сосет, если вы просто не знакомы с ним.
Обратите внимание, что если вы используете каркас приложения, вы получите ошибку, которую вы не хотите в application.designer.Исправление:
Protected Overrides Sub OnCreateMainForm()
''//was: Me.MainForm = Global.WindowsApplication2.Form1
Me.MainForm = New Form1
End Sub
Надеюсь, так будет и при любых плохих побочных эффектах!
Рефлексия Дж. Морено и т. Д.
Вышесказанное настолько просто, что я ненавижупредложить что-то еще, но если вам интересно, здесь есть улучшения в этом коде, чтобы (1) добавить отражение, чтобы исключить необходимость жесткого кода в каждой создаваемой вами форме, и (2) сделать его автоматически принудительным (всего один вызов этого подпрограммы взапуск программы).Просто поместите это в модуль:
Public Sub FixMyForms()
For Each pi As System.Reflection.PropertyInfo In GetType(My.MyProject.MyForms).GetProperties
Dim obj As Object = pi.GetValue(My.Forms, Nothing)
If TypeOf obj Is Form Then
AddHandler CType(obj, Form).Load, AddressOf Complainer
End If
Next
End Sub
Private Sub Complainer(ByVal sender As Object, ByVal e As System.EventArgs)
MsgBox("WRONG!")
End Sub