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

时间:2018-05-25 23:48:32

标签: c# winforms

我需要在你点击垃圾按钮时,选择模式"打开(一个bool变量变为真)并且当你点击那个控件(让他们说一个按钮)时,应用程序"选择它"并使用另一个按钮,(确定按钮)应用程序应该知道您单击的Wich控件,然后删除它们,我有的问题是识别女巫控制您选择 的更新 对于"选择"我的意思是该应用程序知道您点击了哪个控件

2 个答案:

答案 0 :(得分:0)

您可以按如下方式实现所需的功能。这个想法很简单,为了跟踪我们的最后一个选择,我们在类中有一个“ previousSelection ”变量,类型为“Control”。我们甚至可以使用“控制”类型列表来跟踪多个选择。

有一个切换按钮,用于启用/禁用“垃圾模式”,该按钮映射到“bool”类型的“ IsGarbageModeEnabled ”字段。然后我们有一个“ InitControlsRecursiveMethod(ControlCollection集合)”,它接收一组控件,我们将附加一个事件处理程序,即“ GenericClickHandler(Control c) “就我们而言。此处理程序只是在每次单击按钮时更新“previousSelection”。

最后我们按下了“ ConfirmDeletionBtn ”按钮,点击它后,我们会检查“GarbageMode”是否启用,如果是,我们会有一些基本的验证来检查是否被删除的控件不是我们的“删除”或“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;
    }
}

进一步阅读:

答案 1 :(得分:-1)

首先,您需要在某处跟踪“已选中”(单击)的控件。所以将它添加到表单的codebehind:

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();

现在当他们“选择”一个控件时,你将它添加到列表中:

{{1}}

然后删除

{{1}}