在C#中缓慢的动态按钮添加/删除

时间:2019-05-17 22:25:32

标签: c# performance

我通过动态添加/删除按钮来切换按钮。 20次切换后,整个应用程序开始变得越来越慢。

似乎与Dispose()函数有关。当我使用它时,问题变得最严重。您可以看到我如何在粘贴代码中使用它。

我正在使用Visual Studio 2010 Express。

知道我在做什么错吗?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Tracker
{
    public partial class Tracker : Form
    {

        Button New_Trace = new Button();
        Button Continue_Trace = new Button();
        Button Save_Trace = new Button();

        Button New_Point = new Button();
        Button Exit_Trace = new Button();


        public Tracker()
        {
            InitializeComponent();
            Init_Menu1();
        }


        public void Init_Menu1()
        {


            New_Trace.Left = 20;
            New_Trace.Top = 40;
            New_Trace.Text = "New Trace";
            this.New_Trace.Click += new System.EventHandler(this.New_Trace_Click);
            this.Controls.Add(New_Trace);

            Continue_Trace.Left = 100;
            Continue_Trace.Top = 40;
            Continue_Trace.Text = "Cont. Trace";
            this.Continue_Trace.Click += new System.EventHandler(this.Continue_Trace_Click);
            this.Controls.Add(Continue_Trace);

            Save_Trace.Left = 180;
            Save_Trace.Top = 40;
            Save_Trace.Text = "Save Trace";
            this.Save_Trace.Click += new System.EventHandler(this.Save_Trace_Click);
            this.Controls.Add(Save_Trace);
        }

        public void Init_Menu2()
        {


            New_Point.Left = 20;
            New_Point.Top = 40;
            New_Point.Text = "New Point";
            this.New_Point.Click += new System.EventHandler(this.New_Point_Click);
            this.Controls.Add(New_Point);

            Exit_Trace.Left = 180;
            Exit_Trace.Top = 40;
            Exit_Trace.Text = "Exit";
            this.Exit_Trace.Click += new System.EventHandler(this.Exit_Trace_Click);
            this.Controls.Add(Exit_Trace);

        }

        public void remove_Menu1()
        {

            if (this.Controls.Contains(New_Trace))
            {
                // this.New_Trace.Click -= new System.EventHandler(this.New_Trace_Click);
                this.Controls.Remove(New_Trace);
                //New_Trace.Dispose();
            }

            if (this.Controls.Contains(Continue_Trace))
            {
                // this.Continue_Trace.Click -= new System.EventHandler(this.Continue_Trace_Click);
                this.Controls.Remove(Continue_Trace);
                //Continue_Trace.Dispose();
            }

            if (this.Controls.Contains(Save_Trace))
            {
                // this.Save_Trace.Click -= new System.EventHandler(this.Save_Trace_Click);
                this.Controls.Remove(Save_Trace);
                //Save_Trace.Dispose();
            }

        }

        public void remove_Menu2()
        {
            if (this.Controls.Contains(New_Point))
            {
                //this.New_Point.Click -= new System.EventHandler(this.New_Point_Click);
                this.Controls.Remove(New_Point);
                //New_Point.Dispose();
            }

            if (this.Controls.Contains(Exit_Trace))
            {
                //this.Exit_Trace.Click -= new System.EventHandler(this.Exit_Trace_Click);
                this.Controls.Remove(Exit_Trace);
                //Exit_Trace.Dispose();
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void New_Trace_Click(object sender, EventArgs e)
        {
            remove_Menu1();
            Init_Menu2();

        }


        private void Continue_Trace_Click(object sender, EventArgs e)
        {

        }


        private void Save_Trace_Click(object sender, EventArgs e)
        {

        }


        private void New_Point_Click(object sender, EventArgs e)
        {

        }


        private void Exit_Trace_Click(object sender, EventArgs e)
        {
            remove_Menu2();
            Init_Menu1();
        }

    }
}

1 个答案:

答案 0 :(得分:0)

尝试将按钮的可见更改为false / true,而不是删除并重新创建。

button.Visible = true; //set visible to visible
button.Visible = false; //set visible to invisible
button.Visible = !(button.Visible); //set visible to visible if button was invisible or to invisible, if button was Visible

此外,在VS 2015中,您还可以使用性能分析工具(但我不确定它们是否也在VS 2010中)

如果我帮助过您,请标记我的答案正确:D