【问题标题】:Slow navigation when inheriting from a base form从基本表单继承时导航缓慢
【发布时间】:2019-05-19 16:48:19
【问题描述】:

我正在使用一个带有菜单的基本表单,这样我就不必为整个应用程序重新编写代码。

这个表单本质上叫做 StudentBase.cs

然后我有另一个名为 StudentProfile 的表单,它继承自 StudentBase

    public partial class StudentProfile : StudentBase
    {
       public string selectedPage;
    }

这会继承 StudentBase 中的菜单,我不必重新做菜单。

在菜单上,有各个表单的按钮。

假设我按下学生资料我用它来导航:

    private void btnProfile_Click(object sender, EventArgs e)
    {
          //I don't want the page to reload if it is the current page
          if (selectedPage != "Profile") 
          {
             StudentProfile profile = new StudentProfile();
             profile.Show();
             this.Hide();
          }      
    }

这样做会产生非常滞后的结果,并且看起来非常有问题

我在子表单中覆盖 selectedPage 所以在 StudentProfile 的情况下我使用:

   private void StudentProfile_Load(object sender, EventArgs e)
    {
        selectedPage = "Profile";
    }

我已经在我朋友的代码上对此进行了测试,他的导航工作没有延迟或故障。他没有在表单上做继承

【问题讨论】:

  • 不完整。 selectedPage 来自哪里?但是继承一个菜单会冒着激活多个副本的风险。当您单击其他菜单项时,会触发多少次?
  • 我现在添加了选定的页面。如何检查它触发的次数?我可以告诉你,当我点击菜单项的那一刻,内存会发生巨大的跳跃
  • 正确的方法是使用 UserControls 并将它们加载到您的 MainForm 中。
  • 我对 UserControls 做了一些研究,是否有任何特定的视频/页面可以解释如何做到这一点。我尝试使用我观看的视频和几页来做到这一点,我假设您使用一个类实际上能够将菜单添加到您的工具箱中。我似乎无法做到这一点。
  • 有一个功能叫做菜单合并。 ToolStrip 可以是 UserControl(aks 页面)的一部分。请注意,您在这里重新发明了 MDI。

标签: c# winforms navigation


【解决方案1】:

您的继承解决方案的问题在于,当您创建StudentProfile 的实例时,您还创建了StudentBase 表单的实例。您显示这个新实例并隐藏旧实例。您现在有两个 StudentBase 实例(一个可见,一个隐藏)。当您从菜单中打开更多表单时,您会在内存中获得更多 StudentBase 实例。即使它们是隐藏的,它们仍然会消耗资源。这将解释您看到的结果。

我建议你像朋友一样做,这是从主菜单处理子表单的典型方式。

【讨论】:

  • 不仅仅是资源。他们也都订阅相同的事件。
【解决方案2】:

所以,我无法正确弄清楚如何使用 UserControls。我把它放在我的待办事项清单上,这样如果我还有时间的话,我可以在项目结束时尝试一下。

但是,我知道为什么从一个导航移动到另一个导航需要这么长时间。

我正在使用

在基本表单中选择学生详细信息
Student student = new Student();
Student studentDetailsFound = student.GetStudent(2);

每次导航到新表单时,我从未阻止它从数据库中进行选择,因此每次都会延迟两秒。 所以有两个选项可以解决这个问题:静态变量或缓存

我使用了后者,现在它切换到页面的速度相当快。

通过在表单上添加transition,它在视觉上更加流畅。

另请注意:如果您像我一样获取数据,您应该首先等待表单的设计完成。因此,如果:

if (this.Site == null || !this.Site.DesignMode)
{
    studentDetailsFound = GetStudent();
}

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 2016-08-29
    • 2020-12-21
    • 1970-01-01
    • 2016-09-28
    • 2014-08-20
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多