C #: разбиение класса на несколько файлов (с формой) - PullRequest
12 голосов
/ 20 августа 2009

Использование: C #, VS2008

У меня есть следующий основной класс формы:

[Main.cs]

namespace Server
{
   public partial class PipeServerform : System.Windows.Forms.Form
   {
   ...
   }
}

Но он большой и длинный и содержит графический интерфейс + логический код.

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

[DoCommands.cs]

namespace Server
{
   public partial class PipeServerform : System.Windows.Forms.Form
   {
   ...
   }
}

Это работает ... НО! Файл ' DoCommands.cs ' в проекте VS2008 теперь имеет связанное с окном пустое окно формы GUI по умолчанию, связанное с с этим.

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

Есть ли простой способ решить эту точку зрения? Так, чтобы у файла DoCommands.cs не было связанной пустой формы графического интерфейса с ним?

Или я должен буквально разделить его на разные классы?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 20 августа 2009

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

<Compile Include="DoCommands.cs">
  <SubType>Form</SubType>
</Compile>

Измените это на:

<Compile Include="DoCommands.cs">
  <DependentUpon>Main.cs</DependentUpon>
</Compile>

Теперь, когда вы загружаете проект, DoCommands.cs должно отображаться под Main.cs, так же как Main.Designer.cs. Я заметил, что VS, кажется, добавляет элемент SubType автоматически, так что DoCommands.cs по-прежнему будет открываться в конструкторе форм по умолчанию. Возможно, для этого есть простое решение.

5 голосов
/ 20 августа 2009

Я почти уверен, что вам не нужно указывать все наследования для частичного класса. Так что если вы просто удалите System.Windows.Forms.Form из списка наследования для файла DoCommands.cs, вы должны быть золотым.

Редактировать : Кроме того, учитывая размер вашей основной формы, вы можете рассмотреть возможность рефакторинга. Подумайте о том, чтобы следовать шаблону MVC или MVP . Разделите ваши проблемы на отдельные классы и, возможно, даже модули.

1 голос
/ 18 марта 2015

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

[MainForm.cs]

[System.ComponentModel.DesignerCategory("Form")]
public partial class MainForm : MainFormFeature
{
...
}

[MainForm.Designer.cs]

partial class MainForm
{
...
}

[MainForm.Feature.cs]

[System.ComponentModel.DesignerCategory("Code")]
public class MainFormFeature: Form
{
...
}

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

<Compile Include="MainForm.Feature.cs">
  <DependentUpon>MainForm.cs</DependentUpon>
</Compile>

Это единственное решение, которое я смог найти, чтобы оно работало в Visual Studio без получения этой пустой формы конструктора. Это, вероятно, также имеет смысл с точки зрения объектного дизайна.

1 голос
/ 20 августа 2009

Ваше частичное расширение формы не должно наследоваться от System.Windows.Forms.Form - точно так же, как ваши PipeServerform.designer.cs не наследуют его.

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