选项卡式记事本 - 无法删除关闭按钮

时间:2015-05-20 17:04:46

标签: c# winforms tabs notepad

我正在尝试创建一个标签式记事本应用程序但在删除选项卡上的“关闭按钮”时遇到问题。标签会被删除,但我只能删除1个关闭按钮。任何人都可以帮助并指导我走向正确的方向:

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

namespace My_Notepad
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    int TabCount = 0;
    int btx = 96;
    private int i;

    public void newBox()
    {

        TabPage tp = new TabPage("New Document          ");
        RichTextBox rtb = new RichTextBox();
        rtb.Dock = DockStyle.Fill;
        tp.Controls.Add(rtb);
        tabControl1.TabPages.Add(tp);
        this.tabControl1.SelectedTab = tp;
        this.tabControl1.Appearance = TabAppearance.FlatButtons;


        Button btnPlay = new Button();
        this.btnPlay = btnPlay;

        btnPlay.Width = 16;
        btnPlay.Height = 18;
        btnPlay.FlatStyle = FlatStyle.Flat;
        btnPlay.FlatAppearance.BorderSize = 0;
        btnPlay.Top = 25;
        btnPlay.Left = btx;
        btnPlay.Image = Image.FromFile(@"C:\\close-button.png");
        btnPlay.Click += new EventHandler(btnPlay_Click);
        this.Controls.Add(btnPlay);
        btnPlay.BringToFront();
        TabCount++;
        i++;

    }



    private void btnPlay_Click(object sender, EventArgs e)
    {

        tabControl1.SelectedTab.Dispose();
        this.Controls.Remove(btnPlay);

    }


    private void newToolStripMenuItem_Click(object sender, EventArgs e)
    {
        newBox();

        btx = btx + 126;
    }



    public Button btnPlay { get; set; }


   }
   }

1 个答案:

答案 0 :(得分:1)

您的问题似乎是,您不会对您创建的Buttons保持单独的引用。编写代码的方式表明您有一个类级变量btnPlay,您可以为其分配动态创建的局部变量btnPlay,从而覆盖对旧Button的引用:< / p>

Button btnPlay = new Button();
this.btnPlay = btnPlay;

稍后,当您尝试删除Buttons时,您只能到达最后一个。

为了避免这种情况,您需要保留将每个Button连接到它引用的TabPage的引用。最常见的方法是使用您网页的Tag来保存参考:

Button btnPlay = new Button();
this.btnPlay = btnPlay;  
tp.Tag = btnPlay;

现在,只要TabPage仍然存在,您就可以访问它:

private void btnPlay_Click(object sender, EventArgs e)
{
    Button btnPlay = ((sender as TabPage).Tag as Button);
    ..
}

但是,由于您要做的只是摆脱它,因此有一个更简单的解决方案:在btnPlay_Click事件中,您通过{{1}引用了正确的Button } param ..:

sender

为此你甚至不需要使用private void btnPlay_Click(object sender, EventArgs e) { tabControl1.SelectedTab.Dispose(); (sender as Button).Dispose(); } ..不确定你是否对班级Tag做了什么.. ??

<强>然而 ..

..我读它的方式,你的代码还有一个问题:每个关闭按钮只关闭当前选中btnPlay而不是它属于..所以我们真正需要的是保持每个TabPageButton的引用,而不是反过来..:

TabPage

现在这应该有效:

Button btnPlay = new Button();
this.btnPlay = btnPlay;  // what is it good for?
btnPlay.Tag = tp;
不过,如果您对解决方案感到满意,请务必坚持下去!只是想提一下,通常会使用private void btnPlay_Click(object sender, EventArgs e) { Button btnPlay = sender as Button; (btnPlay.Tag as TabPage).Dispose(); btnPlay.Dispose(); } owner drawing添加像关闭按钮这样的装饰品。我会说,你的方式听起来有点简单,至少在你想要移动或调整Tab的大小之前......

更新:由于您询问了所有者绘图,以下是一个最小的示例:

TabControl