Медленная динамическая кнопка добавления / удаления в C # - PullRequest
0 голосов
/ 18 мая 2019

Я переключаюсь между кнопками, добавляя / удаляя их динамически. После 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 голосов
/ 18 мая 2019

Попробуйте изменить видимую кнопку на 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

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