Как удалить TabPage из TabControl? - PullRequest
       10

Как удалить TabPage из TabControl?

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

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

Но, когда я использую ..

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

Это не происходит внутри цикла, потому что счетчик равен нулю. тогда как tabcontrol виден с двумя вкладками в нем.

в чем проблема?

Вот как я добавляю вкладки ->

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 
{ 

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 ]

1 голос
/ 01 июля 2018

Хотя ваш код добавляет вкладку в форму, как если бы вы добавляли какой-либо элемент управления, он не добавляет вкладку в коллекцию TabPages в TabControl, поэтому вы не найдете ее позже.

Добавьте вкладку, как показано ниже, чтобы она отображалась в коллекции TabPages:

    // helper - create a new tabpage
    static private TabPage _AddTabPage( TabControl tabControl, string caption )
    {
        int pageIndex = tabControl.TabPages.Count;
        tabControl.TabPages.Add(caption);
        return tabControl.TabPages[pageIndex];
    }
1 голос
/ 14 ноября 2013

Извините, Ануя, без всего кода трудно сказать, какие из них могут или не могут быть вам полезны, но вот три идеи или мысли, которые вы можете рассмотреть:

1-е рассмотрение:

когда вы добавляете TabPages в TabControl, я замечаю, что вы, кажется, не добавляете его в коллекцию Controls TabControl. Я действительно думаю, что вам может понадобиться добавить tabControl1.Controls.Add(tp);, когда вы добавляете TabPage, чтобы действительно добавить его к 'Count' TabPages для TabControl.

2-е рассмотрение:

Я не знаю, что вызов TabPage.Dispose удалит TabPage из TabControl, но, возможно, он будет работать. Когда я удаляю TabPages, я использую метод TabControl.Remove ().

3-е рассмотрение:

У меня были некоторые проблемы с TabControl, и единственный способ, который я решил, это добавить таймер в мой проект, а затем при следующем тике таймера сделать что-нибудь. поэтому я закончил писать свой собственный процессор действий с различными действиями, которые я мог сделать, и у меня был список действий с отметкой времени, когда это действие должно быть обработано. список действий оказался очень полезным для многих вещей, но сначала он мне понадобился для моего TabControl. в моем случае мне нужно было показать вкладку, но когда я добавил вкладку, она не отображалась правильно, даже когда я установил выбранную вкладку после добавления. Но когда я выбрал вкладку, которую я хотел, примерно через 100 мс после того, как я добавил вкладку, она работала безупречно, с одним небольшим уродством: элемент управления вкладками «мигает». То есть пользователь может видеть мерцание вкладки, поскольку он фактически рисует вновь добавленную вкладку, затем через 100 мс выбирает нужную вкладку. но это был единственный способ решить мою проблему. Интересно, может ли ваша проблема быть связана с моей, где, возможно, вы можете удалить вкладку через 100 мс после того, как пытаетесь это сделать сейчас.

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

Удачного кодирования !!

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

Если у вас есть имя TabPage, что не так с этим ...

tabControl1.TabPages.RemoveByKey("tabPage1");

0 голосов
/ 16 апреля 2018
        foreach(TabPage page in tabctr.TabPages)
        {
            if (page.Name == "tabPage2")
            {
                tabctr.TabPages.Remove(page);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...