【问题标题】:Handling large source code file for form in c#在 C# 中处理表单的大型源代码文件
【发布时间】:2014-02-19 08:36:07
【问题描述】:

我有一个包含三个选项卡的表单。现在每个选项卡都有大约 15 - 20 个功能。因此,当组合起来时,我有大约 50 个方法,处理这么大的类变得相当麻烦。有没有更好的方法来处理这么大的文件。这些方法是否有帮助: 1)三个部分类 2)每个选项卡的单独类(非部分) 3) 地区

请分享您的经验。 提前致谢!

【问题讨论】:

    标签: c# winforms tabs partial-classes regions


    【解决方案1】:

    您可以将每个选项卡分成单独的用户控件。或者甚至比这更细化。

    【讨论】:

    【解决方案2】:

    对于您的TabControl 中的每个TabPage,请执行以下操作:

    Panel 从工具栏中拖入TabPage。将面板的Dock属性设置为Fill

    在解决方案资源管理器中,创建一个 Windows 窗体类型的新元素。

    将新表单中的FormBorderStyle 设置为None

    在包含 TabControl 的表单中使用以下代码

    public MainFrm()
    {
        InitializeComponent();
    
        var subFrm = new SubFrm();
        subFrm.TopLevel = false;
        subFrm.Dock = DockStyle.Fill;
        panelInTabPage.Controls.Add(subFrm);
        subFrm.Show();
    }
    

    现在您可以将每个子表单的逻辑存储在其自己的源文件中。

    【讨论】:

      【解决方案3】:

      对于静态选项卡,我通常将它们分成自己的部分类。我尝试将任何共享的函数放在一个单独的类中并在需要时调用。

      【讨论】:

      • 这比用户控件干净多了。只需将您的代码(很可能在区域中)从主窗体移动到同一命名空间中的几个部分类文件中,这些文件派生自 Form.出于维护原因,不要使兄弟文件依赖于主窗体。 2分钟完成...
      【解决方案4】:

      我之前遇到过这个问题,并且要求我们不使用第三方控件,以便可以轻松地将应用程序移交给第三方。为了解决这个问题,我们有一个主窗体,我们设置IsMdiContainer = true 并将TabControl 停靠到主窗体的到,这样只有TabItems 可见而内容不可见。

      现在,这不是最好的,但它解决了问题,并允许您将每个选项卡的内容编写为具有自己的类等的单独表单。在主表单上设置加载事件以将相关表单加载到你TabControl

      注意,您可以用UserControls 替换后面的Forms,但您将使用将主窗体作为MdiContainer 的能力,并且必须使用Panel 来停靠控件并添加一些代码以将每个用户控件置于最前面。

      private void MainForm_Load(object sender, EventArgs e)
      {
          try {
              LoadMdiForms();
          }
          finally {   
              mdiTabControl.SelectedIndex = 0;
          }       
      }
      

      然后设置List<Form> MdiChildForms { get; set; } 并添加表单

      private void LoadMdiForms()
      {
          createDbForm = new CreateDbForm();
          MdiChildForms.Add(createDbForm);
          valForm = new ValidationForm();
          MdiChildForms.Add(valForm);
          // et al.
      
          foreach (Form mdiChild in MdiChildForms)
          {
              mdiChild.MdiParent = this;
              mdiChild.ShowInTaskbar = false;
              mdiChild.Show();
          }
      }
      

      现在设置一个MainForm_MdiChildActivate 事件处理程序

      private void MainForm_MdiChildActivate(object sender, EventArgs e)
      {
          if (this.ActiveMdiChild == null)
              mdiTabControl.Visible = false; // If no child forms, hide tabControl
          else
          {
              // Child form always maximized.
              this.ActiveMdiChild.WindowState = FormWindowState.Maximized; 
      
              // If child form is new and has no tabPage, create new tabPage.
              if (this.ActiveMdiChild.Tag == null)
              {
                  // Add a tabPage to tabControl with child form caption
                  TabPage tp = new TabPage(this.ActiveMdiChild.Text);
                  tp.Tag = this.ActiveMdiChild;
                  tp.Parent = mdiTabControl;
                  mdiTabControl.SelectedTab = tp;
                  this.ActiveMdiChild.Tag = tp;
                  this.ActiveMdiChild.FormClosed += new FormClosedEventHandler(ActiveMdiChild_FormClosed);
              }
      
              // Make visible if required.
              if (!mdiTabControl.Visible) 
                  mdiTabControl.Visible = true;
          }
      }
      

      现在在 TabControl SelectedIndexChanged 事件上添加事件处理程序

      // If child form closed, remove tabPage.
      private void ActiveMdiChild_FormClosed(object sender, FormClosedEventArgs e)
      {
          ((sender as Form).Tag as TabPage).Dispose();
      }
      
      private void mdiTabControl_SelectedIndexChanged(object sender, EventArgs e)
      {
          if ((mdiTabControl.SelectedTab != null) && 
               (mdiTabControl.SelectedTab.Tag != null))
          {
              this.BeginUpdate();
              (mdiTabControl.SelectedTab.Tag as Form).Select();
              this.EndUpdate();
          }
      }
      

      就是这样。你应该有一个工作的TabControl 和原子TabItems。

      我希望这会有所帮助。

      【讨论】:

      • 为什么要投反对票,这是一个不错的折衷方案!
      【解决方案5】:

      一些处理 GUI 组件的方法:

      • 当启动一个新项目时,我们总是有一些基本的用户控制(或至少是界面)
      • 每当我们觉得某个特定控件(标准用户控件除外)可以在其他地方使用时,我们会将其分离为自定义用户控件。
      • 我们通常将所有自定义用户控件分离到一个独立项目中。

      对于您的特定问题,您可以将每个选项卡分隔为独立的自定义用户控件。

      一些解决方法:http://msdn.microsoft.com/en-us/library/aa302342.aspx

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多