Как я могу удалить вкладки из tabcontrol, используя c # - PullRequest
1 голос
/ 06 октября 2009

Как я могу удалить вкладки из tabcontrol, когда я ссылаюсь на каждую вкладку для дочерней формы.

Я использую tabcontrol, я хочу удалить конкретную вкладку из элемента управления. Значение, которое я должен сделать в строке, которую я динамически.

Как удалить вкладку из tabcontrol, используя имя существующей вкладки, которое у меня есть в строке ??

Я пробовал что-то вроде ...

 string tabToRemove = "tabPageName";
for (int i = 0; i < myTabControl.TabPages.Count; i++)
{
if (myTabControl.TabPages[i].Name.Equals(tabToRemove, StringComparison.OrdinalIgnoreCase))
{
    myTabControl.TabPages.RemoveAt(i);
    break;
}

}

Но в приведенном выше коде myTabControl.TabPages.Count всегда равен нулю.

Ниже приведен код, показывающий, что я создаю вкладки. Это работает отлично.


         public void TabIt(string strProcessName)

        {
                    this.Show();

                    //Creating MDI child form and initialize its fields
                    MDIChild childForm = new MDIChild();
                    childForm.Text = strProcessName;
                    childForm.MdiParent = this;

                    //child Form will now hold a reference value to the tab control
                    childForm.TabCtrl = tabControl1;

                    //Add a Tabpage and enables it
                    TabPage tp = new TabPage();

                    tp.Parent = tabControl1;
                    tp.Text = childForm.Text;
                    tp.Show();
                    //child Form will now hold a reference value to a tabpage
                    childForm.TabPag = tp;
                    //Activate the MDI child form
                    childForm.Show();
                    childCount++;

                    //Activate the newly created Tabpage.
                    tabControl1.SelectedTab = tp;
                    tabControl1.ItemSize = new Size(200, 32);
                    tp.Height = tp.Parent.Height;
                    tp.Width = tp.Parent.Width;
        }


      public void GetTabNames()

      {

foreach (string strProcessName in Global.TabProcessNames)

                    {
                        TabIt(strProcessName);
                    }
        }

Дочерняя форма:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
using System.Drawing.Drawing2D;

namespace Daemon
{
    /// <summary>
    /// Summary description for MDIChild.
    /// </summary>
    /// 

    public class MDIChild : System.Windows.Forms.Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
        private TabControl tabCtrl;
        private TabPage tabPag;

        public MDIChild()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //MDIChild TargerForm = new MDIChild();
            //WinApi.SetWinFullScreen(TargerForm.Handle); 
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        public TabPage TabPag
        {
            get
            {
                return tabPag;
            }
            set
            {
                tabPag = value;
            }
        }

        public TabControl TabCtrl
        {
            set
            {
                tabCtrl = value;
            }
        }


        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // MDIChild
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.BackColor = System.Drawing.SystemColors.InactiveCaptionText;
            this.ClientSize = new System.Drawing.Size(0, 0);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "MDIChild";
            this.Opacity = 0;
            this.ShowIcon = false;
            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
            this.Text = "MDIChild"; 
            this.Activated += new System.EventHandler(this.MDIChild_Activated);
            this.Closing += new System.ComponentModel.CancelEventHandler(this.MDIChild_Closing);
            this.ResumeLayout(false);

        }
        #endregion

        private void MDIChild_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            try
            {
                //Destroy the corresponding Tabpage when closing MDI child form
                this.tabPag.Dispose();

                //If no Tabpage left
                if (!tabCtrl.HasChildren)
                {
                    tabCtrl.Visible = false;
                }
            }
            catch (Exception ex)
            { 
            }
        }

        private void MDIChild_Activated(object sender, System.EventArgs e)
        {
            try
            {
                //Activate the corresponding Tabpage
                tabCtrl.SelectedTab = tabPag;

                if (!tabCtrl.Visible)
                {
                    tabCtrl.Visible = true;
                }
                Global.ExistingTabProcessNames.Add(tabPag.Text);
            }
            catch (Exception ex)
            { 
            }
        }

    }
}

Ответы [ 4 ]

2 голосов
/ 06 октября 2009

Для начала вы должны зацикливаться на обратном:

for (int i = myTabControl.TabPages.Count - 1; i >= 0 ; i--)
{
   ......
}

РЕДАКТИРОВАТЬ: игнорировать меня. Я пропустил перерыв ; и да, это также должно быть> =: (

Моя следующая теория: вам не хватает этой строки:

 // add the page to the tab control
 tabControl1.Controls.Add(tp);

PS: почему при копировании кода из SO не поддерживаются CRLF. Это очень раздражает!

1 голос
/ 06 октября 2009

Как предположил Юссий, вам нужно сделать следующее:

tabControl1.Controls.Add(tp);

И вы можете легче найти вкладку следующим образом:

var foundTab = (from System.Windows.Forms.TabPage tab in tabControl1.TabPages.Cast<TabPage>()
                where tab.Name == "tabName"
                select tab).First();
1 голос
/ 06 октября 2009

Я не знаю назначение вашего кода, но если вы в конечном итоге повторно добавите вкладку, почему бы просто не скрыть ее? Это проще, и вам не нужно беспокоиться о логике обратного цикла и неверных аргументах, когда страница скрыта и тому подобное. Если вам нужен способ одновременного обращения ко всем вкладкам, просто проверьте наличие видимых вкладок ...

0 голосов
/ 06 октября 2009

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

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