You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#入门:如何删除运行时添加的Note组件(含按钮与文本框)

解决方案

嘿,新手朋友别着急!这个问题其实超容易解决,咱们用WinForms自带的一个小功能就能搞定——控件的Tag属性,专门用来存和控件关联的额外信息,正好可以把按钮所属的Note对象绑上去~

步骤1:给Remove按钮绑定对应的Note

在你添加Note到窗体的load_Click方法里,给每个Remove按钮的Tag赋值为当前创建的Note对象,这样按钮就“记住”自己属于哪个Note啦:

private void load_Click(object sender, EventArgs e) {
    Note note = MyNotes.AddNote();
    if (note != null) {
        this.Controls.Add(note.GetBox());
        this.Controls.Add(note.GetRemoveButton());
        this.Controls.Add(note.GetSaveButton());
        // 关键代码:把当前Note存到Remove按钮的Tag里
        note.GetRemoveButton().Tag = note;
        note.GetRemoveButton().Click += new EventHandler(remove_Click);
    }
    richTextBox1.Text = MyNotes.SetNote();
}

步骤2:修改remove_Click方法,取出绑定的Note

现在点击Remove按钮时,sender是这个按钮,咱们先把它转成Button类型,然后从Tag里取出对应的Note,之后就能删掉这个Note的所有控件了,还要记得从MyNotes.noteList里移除这个Note,不然下次添加的数量计算会出错,另外把y值减回去,不然新添加的Note位置会乱:

private void remove_Click(object sender, EventArgs e) {
    // 先把sender转换成Button对象
    Button clickedRemoveBtn = sender as Button;
    if (clickedRemoveBtn != null) {
        // 从Tag里取出对应的Note
        Note targetNote = clickedRemoveBtn.Tag as Note;
        if (targetNote != null) {
            // 删除这个Note的三个控件
            Controls.Remove(targetNote.GetBox());
            Controls.Remove(targetNote.GetSaveButton());
            Controls.Remove(targetNote.GetRemoveButton());
            // 从列表里移除这个Note,保证数量正确
            MyNotes.noteList.Remove(targetNote);
            // 把y坐标减回去,下次添加的位置才对
            MyNotes.y -= 22;
        }
    }
}

可选优化:用Panel统一管理Note的控件

如果你想让代码更整洁,还可以给每个Note加一个Panel容器,把TextBox、Remove、Save按钮都放到Panel里,这样删除的时候直接删掉整个Panel就行,不用一个个删控件:

修改Note类

class Note {
    // 新增一个Panel当容器
    private Panel noteContainer;
    private TextBox box;
    private Button remove;
    private Button save;

    public Note() {
        // 初始化Panel
        noteContainer = new Panel();
        noteContainer.Size = new Size(320, 20); // 设置合适的大小
        boxSettings();
        removeSettings();
        saveSettings();
        // 把三个控件加到Panel里
        noteContainer.Controls.Add(box);
        noteContainer.Controls.Add(remove);
        noteContainer.Controls.Add(save);
    }

    // 新增获取容器Panel的方法
    public Panel GetNoteContainer() {
        return noteContainer;
    }

    private void boxSettings() {
        box = new TextBox();
        box.Width = 250;
        box.BackColor = System.Drawing.Color.DarkGray;
        box.Location = new Point(100, 0); // 相对于Panel的位置
    }

    private void removeSettings() {
        remove = new Button();
        remove.Text = "X";
        remove.TextAlign = ContentAlignment.MiddleCenter;
        remove.Width = 20;
        remove.Location = new Point(15, 0); // 相对于Panel的位置
    }

    private void saveSettings() {
        save = new Button();
        save.Text = "SAVE";
        save.TextAlign = ContentAlignment.MiddleCenter;
        save.Width = 50;
        save.Location = new Point(40, 0); // 相对于Panel的位置
    }

    // 保留获取按钮的方法,用来绑定事件
    public Button GetRemoveButton() {
        return this.remove;
    }

    public Button GetSaveButton() {
        return this.save;
    }
}

修改MyNotes的AddNote方法

public static Note AddNote() {
    if (noteList.Count < 4) {
        Note note = new Note();
        // 设置Panel的位置,不用再单独设置每个控件的位置了
        note.GetNoteContainer().Location = new Point(0, y);
        y += 22;
        noteList.Add(note);
        return note;
    } else {
        MessageBox.Show("It's only possible to set a maximum of 4 notes. Please delete or rewrite another one.");
        return null;
    }
}

修改Form1的load_Click方法

private void load_Click(object sender, EventArgs e) {
    Note note = MyNotes.AddNote();
    if (note != null) {
        // 只需要把Panel加到窗体里
        this.Controls.Add(note.GetNoteContainer());
        note.GetRemoveButton().Tag = note;
        note.GetRemoveButton().Click += new EventHandler(remove_Click);
    }
    richTextBox1.Text = MyNotes.SetNote();
}

修改remove_Click方法

private void remove_Click(object sender, EventArgs e) {
    Button clickedRemoveBtn = sender as Button;
    if (clickedRemoveBtn != null) {
        Note targetNote = clickedRemoveBtn.Tag as Note;
        if (targetNote != null) {
            // 直接删除整个Panel,里面的控件会一起被移除
            Controls.Remove(targetNote.GetNoteContainer());
            MyNotes.noteList.Remove(targetNote);
            MyNotes.y -= 22;
        }
    }
}

这样代码更清晰,也不容易出错,以后要给Note加新控件也只需要加到Panel里就行~

内容的提问来源于stack exchange,提问作者Jendara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:27:37