Причина этого VB6-подобного запаха, который позволяет VB.NET, вместо этого: Ошибка WinFormType.InstanceProp = Значение

Я заметил что-то очень неприятное с обработкой VB.Net объектов Winform.

Это разрушило несколько часов нашего времени. Это будет только ухудшаться, так как у нас больше наших программистов 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 

Помните, что свойства и методы не разделены. Поворот frameworks приложения не имеет значения. Кажется, что за кулисами 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) добавить reflection, чтобы не указывать в жестком коде в каждой форме, которую вы делаете, и (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 

Сорта. Вы можете создать функцию или переопределить ShowDialog, которая проверяет коллекцию My.Forms, чтобы увидеть, присутствует ли в ней текущий экземпляр, и если это исключение. Невозможно использовать параметр, чтобы предотвратить его использование.

EDIT: добавление кода примера, иллюстрирующего концепцию (с использованием звукового сигнала вместо исключения).

  Shared Function FormIsInMyForms(formName As String, frm As Form) If formName = "Form1" Then If frm.Equals(Form1) Then Return True Else Return False End If End If Return False End Function Public Overloads Sub ShowDialog() If FormIsInMyForms("Form1", Me) Then Beep() End If MyBase.ShowDialog() End Sub 

Выполнение того же самого результата через reflection остается как упражнение для читателя … 🙂

Нет. Это путаное поведение по дизайну.

В VB было возможно использовать один экземпляр формы без его создания, и это поведение с удовольствием перешло к VB.NET. Для меня это один из худших вариантов дизайна.
Но это упрощает преобразование старых проектов. И это делает одолжение тем, кто даже не знал, что форма может быть явно создана.

Но вы не обязаны использовать этот трюк, поскольку вы никогда не были в VB6. На обоих языках вы можете использовать явно созданные экземпляры, и в этом случае экземпляр по умолчанию не будет создан. Просто забудьте, что эта «функция» существует и только позволяет ей вернуться к мысли, когда просвещает других.

  • Как получить доступ к управлению текстовым полем Winform из другого classа?
  • как программно перемещать мышь, щелкнуть, правым кликом и нажатием клавиши и т. д. в winform и wpf?
  • ComboBox.SelectedText не дает мне SelectedText
  • Включить Entity Framework 6 для MySql (C #) в WinForms Microsoft Visual Studio 2013
  • как сортировать строку как число в datagridview в winforms
  • Проверка ввода / ввода данных .NET. Контроль состояния OK или NOK
  • Как автоматически перейти к нижней части многострочного текстового поля?
  • Как я могу вызвать событие рисования?
  • Создайте BackgroundWorker, выполнив несколько операций последовательно, не замораживая форму
  • Захват нескольких ключевых нажатий в C #
  • Как проверить, открыта ли форма для Windows, и закрыть ее, если она есть?
  • Давайте будем гением компьютера.