Создание частичного класса для формы - PullRequest
4 голосов
/ 30 ноября 2010

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

Проблема: когда я создаю частичный класс своей формы, скажите:

Partial Public Class Form1

End Class

Visual Studio решает, что мне нужна другая форма для этого частичного класса.

Вопросы:
1. Как мне создать частичный класс для формы?
2. Если я не могу этого сделать, как я могу разбить все события в моей форме на разные файлы?

Ответы [ 6 ]

4 голосов
/ 30 ноября 2010

Да, это так.Как только вы отбросите элемент управления в этой фантомной форме, вы получите код времени разработки (InitializeComponent), сгенерированный в этом файле исходного кода.Это поведение совместимости для .NET 1.x, оно не поддерживает ключевое слово Partial.Который сломает сборку, теперь их два.Этого можно избежать с помощью осторожного нажатия, но вы знаете, что это произойдет рано или поздно.

Кстати, другие вещи тоже идут не так, дизайнер больше не может отслеживать обработчик событий при перемещении его из одного файла в другой,И с готовностью позволит вам добавить еще один, гораздо более хитрый источник ошибок.

Это просто не очень хорошо работает, оставьте надежду полагаться на него, чтобы решить вашу проблему.

Общая диагностикав том, что запутанный пользовательский интерфейс порождает запутанный код.Но этот корабль отплыл, без сомнения.Более структурное решение - использование модели MVC, отделяющей данные от их представления.У вас все еще будет много обработчиков событий, но они не будут делать ничего, кроме вызова метода класса, который выполняет настоящую работу.Чей исходный код может, конечно, жить в другом файле исходного кода.Типичное зависание в том, что Windows Forms не имеет никакой поддержки, встроенной для этого, вы должны создать ее вручную.Ничего похожего на модель MVVM в WPF.

То, что может хорошо работать, - это изоляция элемента управления + кода в отдельный UserControl.Вы должны делать это осторожно, однако, вам не нужно добавлять кучу свойств и событий, которые предоставляют внутренние средства управления.

2 голосов
/ 29 ноября 2012

Иногда я создаю частичные классы для лучшей читабельности, особенно когда у меня очень большие классы.Но когда я нажимаю на частичный класс, VS IDE откроет редактор форм, показывающий мне пустую форму.Если мне все равно, чем я могу повредить основную форму (кажется, это ошибка VS 2008/2010)

Возможно, можно использовать DesignerCategoryAttribute Class

Отметьте частичный класс с атрибутом «код».

 <System.ComponentModel.DesignerCategory("code")>
 Partial Class Form1

 End Class

Таким образом, когда вы нажимаете на файл, вы открываете класс в редакторе кода.Конечно, это относится ко всем файлам, а также к основному файлу формы.Если вы хотите снова отредактировать вашу форму в редакторе форм, вы должны указать атрибут:

 '<System.ComponentModel.DesignerCategory("code")>

Некоторые дополнительные сведения здесь .

0 голосов
/ 30 июля 2016

для меня (VS 2010) работало именование класса Form1, уже сохраненного в Form1.vb с его собственным конструктором (Form1.Designer.vb), как:

Public Class Main 'saved in Form1.vb

VS обновил имя вконструктор как:

Partial Class Main 'saved in Form1.Designer.vb

затем я создал еще один "частичный класс" с тем же именем:

Partial Class Main 'saved in Main.vb

Редактирую ли я Form1.vb или Main.vb VS показывает меня наверхняя панель навигации - все процедуры, функции, сабвуферы, даже фоновые рабочие и таймеры.Для обработчиков событий, чтобы избежать лазейки, упомянутой ранее (вы нажимаете на элемент управления в дизайнере макетов, и в оригинальном Form1.vb будет создан совершенно новый обработчик событий) Я иду:

Partial Public Class Main 'in Form1.vb file
    Private Sub SomeControl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SomeControl.Click
        Call SomeControlClick(sender, e)
    End Sub
End Class

Partial Public Class Main 'then in Main.vb file
    Private Sub SomeControlClick(ByVal sender As Object, ByVal e  As System.EventArgs)
        'blah blah
    End Sub
End Class
0 голосов
/ 12 марта 2013

Я ценю ответы, данные Гансом, и я вовсе не оспариваю их. Любопытно, что в Visual Studio 2010, когда вы создаете форму, скажем, Main, вы получаете Main.designer.vb, который является частичным классом. В верхней части написано «Частичный класс Main». Этот класс не открывает форму при нажатии. Он также включает ссылку на обработчики событий. Поэтому мне было интересно, как они обходят это? Есть ли способ создать один из этих «специальных» частичных классов, которые работают так, как мы ожидаем?

Я заметил, что когда я создавал класс частичной формы, значок переходил от значка класса к значку формы. Значок, связанный с файлом Main.designer.vb, выглядит как значок класса со стрелкой.

0 голосов
/ 30 ноября 2010

Хотя это не отвечает на первоначальный вопрос, я обнаружил, что использование регионов сделало мой код немного более управляемым / читабельным.

#Region "RegionA"

#End Region

Я первоначально назвал этот метод "взломать", поэтому комментарий ниже.

0 голосов
/ 30 ноября 2010

Не уверен, что вы подразумеваете под "Visual Studio решает, что вам нужна другая форма", однако вы уверены, что новый частичный класс Form1 объявлен в соответствующем исходном пространстве имен?

Все частичные классы для данного.Конечно, тип NET должен быть объявлен в одном и том же пространстве имен (независимо от того, в каких файлах он хранится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...