Frage

Mein Szenario ist folgende:

Ich arbeite an einer WinForms-Anwendung in C #, das eine Schaltfläche innerhalb der Hauptseite eines tabcontrol hat, dass eine andere tabpage jedes Mal generiert, dass es angeklickt wird. Jede neue tabpage wird ein Layout durch eine Benutzersteuerung definiert enthalten.

Meine Fragen sind:

  1. Wie kann ich dem Benutzer erlauben, dann auf eine der Registerkarten zu schließen, die zur Laufzeit dynamisch erstellt wurden?

  2. Wie kann ich mich über die tabcontrol Modifizierung so selbst, dass es eine kleine hat ‚X‘ in jedem Register, die der Benutzer, um klicken Sie können diesen bestimmten Tab zu schließen? (Wie Firefox hat)

  3. Wie kann ich die SelectedIndex Eigenschaft des tabcontrol dem Benutzer Kontrolle aussetzen, wenn ich auf die Registerkarte mit einem Knopf in der Benutzersteuerung schließen möchten stattdessen?

War es hilfreich?

Lösung

Ich habe eine abgeleitete Registerkarte vor etwa einem Jahr. Ich werde nicht die Quelle hier veröffentlichen, weil es etwa 700 Zeilen lang ist und codiert ziemlich chaotisch. Vielleicht werde ich einige Zeit finden Sie den Code bis zu reinigen und es dann hier veröffentlichen. Denn jetzt werde ich kurz auf die Art und Weise skizziert es bauen.

Jede Registerkarte hat ein ‚X‘ Symbol in den links des Titels und die Registerkarten Neuordnungs unterstützen, indem sie per Drag & Drop und sich zwischen mehreren Registersteuern bewegen.

Ich wähle die einfache Möglichkeit, das Symbol auf den Registerkarten zu erhalten. Die Registerkarte hat die TabControl.ImageList Immobilien und eine Registerkarte hat einen TabPage.ImageIndex Eigentum. Also habe ich nur drei Symbole auf eine Bildliste - Normal, Hover, gedrückt -. Und verarbeiten die Mausereignisse

Mit TabControl.GetTabRect() können Test, wenn die Maus über einen bestimmten Registerkarten ist und mit etwas Mathematik, die Sie finden, wenn es über das Symbol ist. Dann brauchen Sie nur das Symbol ändern auf der Maustaste Zustand abhängig und schließlich die Registerkarte unter der Maus zu entfernen, wenn die Taste gedrückt wurde.

Das Hauptproblem bei dieser Lösung ist, dass die Berechnung, wenn die Maus über das Symbol ist erforderlich zu wissen, wo ich das Symbol in der Registerkarte relativ gemalt wird und dies könnte mit einer neuen Windows-Version ändern. Und das Symbol links von dem Titel, aber das sieht nicht allzu schlecht.

Andere Tipps

Ich habe diesen Code und war sehr hilfreich für mich:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl: Wie Capture Mouse Right-Click auf Tab

Ich habe folgende Möglichkeiten: auf der erstellen (add) TabPage Bühne, habe ich ein toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

Erstellen Sie dann die X Schaltfläche, und fügen Sie toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

ein Ereignis erstellen, die auf Klick auf die Schaltfläche X

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

hinzufügen toolstrip zum tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

Jetzt für die ToolStripButton_Click ist wie folgt:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

Vielleicht ist es nicht, wie Sie wollen, aber es wird gut funktionieren.

Ich habe ein Setup, das ähnlich ist.

Jede Steuerung, die auf die Registerkarte zur Laufzeit hinzugefügt wird, wird von einer speziellen Basissteuerung abgeleitet ich herstellte. Diese Basissteuerung verfügt über eine Schaltfläche zum Schließen (zusammen mit einigen anderen Funktionen wie sichere Flagge schließen).

Tab schließt Code Ich verwende auf meiner Basissteuerung:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);

Ich weiß, dass dies ein alter Thread, aber ich habe dieses Link finden , die zu „verstecken“ Tabs in einem Array Ihnen erlaubt, und dann können Sie nur die Tabs, die Sie während der Laufzeit wollen erneut laden. Ich habe diese mehr für einen Ort, wo ich sie leicht wieder finden kann.

Dieser Code könnte throgh helfen, die Registerkarten mit der mittleren Maustaste endet:

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }

Es ist funktioniert!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top