我正在尝试创建一个标签式记事本应用程序但在删除选项卡上的“关闭按钮”时遇到问题。标签会被删除,但我只能删除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; }
}
}
答案 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
而不是它属于..所以我们真正需要的是保持每个TabPage
到Button
的引用,而不是反过来..:
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