如何在Winforms C#中删除所选控件?

如何在Winforms C#中删除所选控件?,c#,winforms,C#,Winforms,我需要当你点击一个垃圾按钮时,“选择模式”打开(一个bool变量变为true),当你点击那个控件(比如一个按钮)时,应用程序“选择它”,用另一个按钮,(确定按钮)应用程序应该知道你点击了哪个控件,然后删除它们,我遇到的问题是您选择的识别开关控制 更新 对于“选择”,我的意思是应用程序知道您单击了哪个控件,您可以实现所需的功能,如下所示。想法很简单,为了跟踪上一次的选择,我们在班上有一个“Control”类型的“previousSelection”变量。我们甚至可以使用类型“Control”的列表

我需要当你点击一个垃圾按钮时,“选择模式”打开(一个bool变量变为true),当你点击那个控件(比如一个按钮)时,应用程序“选择它”,用另一个按钮,(确定按钮)应用程序应该知道你点击了哪个控件,然后删除它们,我遇到的问题是您选择的识别开关控制 更新
对于“选择”,我的意思是应用程序知道您单击了哪个控件,您可以实现所需的功能,如下所示。想法很简单,为了跟踪上一次的选择,我们在班上有一个“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(发件人)