С#: разбиение класса на несколько файлов (с формой)

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

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

[Main.cs]

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

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

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

[DoCommands.cs]

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

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

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

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

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

Спасибо.

Ответ 1

Если вы хотите подчинить себя под 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 по-прежнему будет открываться в Forms Designer по умолчанию. Возможно, для этого есть и простое решение.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

[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
{
...
}

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

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

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