如何在Winforms C#中删除所选控件?
我需要当你点击一个垃圾按钮时,“选择模式”打开(一个bool变量变为true),当你点击那个控件(比如一个按钮)时,应用程序“选择它”,用另一个按钮,(确定按钮)应用程序应该知道你点击了哪个控件,然后删除它们,我遇到的问题是您选择的识别开关控制 更新如何在Winforms C#中删除所选控件?,c#,winforms,C#,Winforms,我需要当你点击一个垃圾按钮时,“选择模式”打开(一个bool变量变为true),当你点击那个控件(比如一个按钮)时,应用程序“选择它”,用另一个按钮,(确定按钮)应用程序应该知道你点击了哪个控件,然后删除它们,我遇到的问题是您选择的识别开关控制 更新 对于“选择”,我的意思是应用程序知道您单击了哪个控件,您可以实现所需的功能,如下所示。想法很简单,为了跟踪上一次的选择,我们在班上有一个“Control”类型的“previousSelection”变量。我们甚至可以使用类型“Control”的列表
对于“选择”,我的意思是应用程序知道您单击了哪个控件,您可以实现所需的功能,如下所示。想法很简单,为了跟踪上一次的选择,我们在班上有一个“Control”类型的“previousSelection”变量。我们甚至可以使用类型“Control”的列表来跟踪多个选择 有一个切换按钮用于启用/禁用“垃圾模式”,该模式映射到类型为“bool”的“IsGarbageModeEnabled”字段。然后我们有一个“InitControlsRecursiveMethod(ControlCollection集合)”,它接受一个控件集合,我们将向其附加一个事件处理程序,在本例中,它是“GenericClickHandler(Control c)”。此处理程序只需在每次单击按钮时更新“previousSelection” 最后,我们有一个按钮“confirmdelectionbtn”,点击它,我们会检查“GarbageMode”是否启用,如果启用,我们会进行一些基本验证,以检查被删除的控件是否不是我们的“Delete”或“GarbageModeToggle”按钮本身(如果用户双击“删除”按钮,可能会导致问题)。之后,它将删除/处置要删除的控件
public partial class FormName : Form
{
//To keep track of the previously selected control (i.e. to be deleted)
private Control previousSelection { get; set; }
//To keep track of whether "Garbage Mode" is enabled or disabled
private bool IsGarbageModeEnabled { get; set; }
//Constructor
public FormName()
{
InitializeComponent();
IsGarbageModeEnabled = false;
previousSelection = new Control();
//Attach a generic click handling event to each control to
//update "previousSelection" with each click.
//Similar logic can be used for other events as well
//(e.g. GotFocus, which might even accomodate control selection via keyboard).
InitControlsRecursive(this.Controls);
}
//This attaches the GenericClickHandler(Control c) to each control on the form.
private void InitControlsRecursive(Control.ControlCollection collection)
{
foreach (Control c in collection)
{
c.MouseClick += (sender, e) => { GenericClickHandler(c); };
InitControlsRecursive(c.Controls);
}
}
//The generic click handling event we're using to update "previousSelection".
private void GenericClickHandler(Control c)
{
previousSelection = c;
}
//By clicking the confirm deletion / OK button, we would delete the last selected control.
private void ConfirmDeletionBtn_Click(object sender, EventArgs e)
{
if(IsGarbageModeEnabled == true)
{
if(previousSelection != ConfirmDeletionBtn || previousSelection != ToggleGarbageModeBtn)
{
this.Controls.Remove(previousSelection);
previousSelection.Dispose();
}
}
}
//This is used to enable/disable Garbage Mode. Controls can be deleted only once it is enabled.
private void ToggleGarbageModeBtn_Click(object sender, EventArgs e)
{
IsGarbageModeEnabled = !IsGarbageModeEnabled;
}
}
进一步阅读:
List<Control> _itemsToDelete = new List<Control>();
要激活垃圾模式,请执行以下操作:
bool _garbageMode = false;
async void GarbageMode_Click(object sender, EventArgs e)
{
_garbageMode = true;
}
现在,当他们“选择”一个控件时,您可以将其添加到列表中:
async void Control_Click(object sender, EventArgs e)
{
if (_garbageMode)
{
_itemsToDelete.Add((Control)sender);
}
}
然后删除
foreach (var control in _itemsToDelete)
{
this.Controls.Remove(control);
control.Dispose();
}
_itemsToDelete.Clear();
应用程序应该知道您单击了哪个控件。……对于“选择”,我的意思是应用程序知道您单击了哪个控件,因此OP想知道单击了哪些按钮,而不是当前哪个按钮处于焦点。@JohnWu OP在问题中提到“应用程序知道单击了哪个控件”不是按钮,所以这是您自己添加的。其次,通过简单的逻辑,您可以轻松跟踪以前选择的“控件”,如果使用焦点事件,如我所演示的那样。@JohnWu无论如何,我已更新了我的答案,因此您现在可以删除您的否决票。请查看。请查看我的更新答案。我已实现了所需的功能。如果您觉得有帮助,请不要忘记批准/否决。因此,根据此逻辑,如果表单上有20个控件,则使它们“可删除”,我们必须为它们中的每一个修改click事件?不,您可以有一个通用的click处理程序,如果需要,您可以通过编程方式将其添加到现有处理程序之上。一个控件可以有多个事件处理程序,没有问题。即使只有一个处理程序,您也可以知道castin导致事件的控件g
发送者,如示例中所示。非常感谢!但是如果我想通过另一次单击取消选择一个控件,该怎么办?(例如,如果您已经选择了一个控件,但您犯了一个错误,希望通过另一次单击取消选择该控件),您只需要执行类似于if(\u itemsToDelete.Contains(sender))\u itemsToDelete.Remove(sender)的操作else\u itemsToDelete.Add(发件人)