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
相关产品推荐
相关产品推荐

