Visual Studio против #Develop — обработчики событий по умолчанию

Visual Studio и SharpDevelop не настраивают делегатов для обработки событий одинаково. То, как они устроены, немного отличается. Это затрудняет использование VS в одном месте и #Develop в другом (в одном и том же проекте).

Например, в VB Visual Studio делает следующее:

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.OK
    Me.Close()
End Sub

И ...

Friend WithEvents OK_Button As System.Windows.Forms.Button

Так что контрол объявляется не только с другим скоупом (с этим тоже может быть проблема, но не в тему этого поста), а с атрибутом withevents. Затем ему назначается обработчик события с помощью предложения handles.

в #Develop это делается так...

Sub OK_ButtonClick(sender As Object, e As EventArgs)

End Sub

и ...

Private button1 As System.Windows.Forms.Button

Затем в методе InitializeComponent

AddHandler Me.button1.Click, AddressOf Me.OK_ButtonClick

Самое неприятное в этом то, что даже если это сделано одним способом, другой ide повторит это, имея дублирующие объявления и, конечно же, ошибки времени компиляции.

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


person hmcclungiii    schedule 19.02.2009    source источник


Ответы (4)


выньте их из .designer и подключите вручную в конструкторе в коде позади. .designer регенерируется дизайнером любого инструмента, который вы используете

person Matt Briggs    schedule 19.02.2009
comment
Есть ли способ автоматизировать это, вместо того, чтобы делать это вручную? Я делал это раньше с классами веб-сервисов, и это действительно было отстойно. - person hmcclungiii; 19.02.2009
comment
Вырезать и вставить из конструктора. - person recursive; 06.03.2009

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

Для внесения необходимых изменений вам может потребоваться изменить или переопределить методы InsertComponentEvent и CreateEventHandler в классе VBNetDesignerGenerator. Это в проекте FormsDesigner.

Вы можете получить исходный код здесь.

person Jorge Villuendas Zapatero    schedule 01.03.2009
comment
Спасибо за точные детали реализации. - person hmcclungiii; 03.03.2009

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

Причина, по которой #develop работает именно так, заключается в том, что это прямой порт того, как C# добавляет обработчики событий, например,

AddHandler Me.button1.Click, AddressOf Me.OK_ButtonClick

просто прямой перевод:

this.button1.Click += new EventHandler(OK_ButtonClick);

Если вы использовали C#, и Visual Studio, и #Develop будут точно так же обрабатывать создание событий в коде.

Очевидно, что никто не уделяет внимание обычному варианту использования Visual Basic в #Develop, и, как я уже сказал выше, это один из тех второстепенных случаев, когда вам, возможно, придется самостоятельно настраивать код или, возможно, даже вносить свой вклад в исходный код #Develop. для данного конкретного случая.

Я уверен, что все, кто использует #Develop для Visual Basic, оценят это.

person Jon Limjap    schedule 03.03.2009

Это не будет самым практичным предложением, но я обещаю, что оно сделает работу за вас.

#Develop имеет открытый исходный код. Итак, теоретически вы можете изменить кодовую базу так, чтобы она работала так же, как Visual Studio.net... Я не уверен, насколько это может быть связано, но я решил поделиться своей идеей...

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

С уважением, Франк В.

person Frank V    schedule 03.03.2009