【问题标题】:How to Delete selected control in Winforms C#? [closed]如何在 Winforms C# 中删除选定的控件? [关闭]
【发布时间】:2018-05-25 23:48:31
【问题描述】:

我需要当您单击垃圾按钮时,“选择模式”打开(布尔变量变为真),当您单击该控件(比如说一个按钮)时,应用程序“选择它”并使用另一个按钮, (确定按钮)应用程序应该知道您单击了哪个控件,然后删除它们,我遇到的问题在于您选择的识别女巫控件 更新 对于“选择”,我的意思是应用知道您点击了哪个控件

【问题讨论】:

  • 看看this post
  • 请查看我的更新答案。我已经实现了所需的功能。
  • 如果您觉得有帮助,请不要忘记批准/点赞。

标签: c# winforms


【解决方案1】:

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

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

最后我们有我们的按钮“ConfirmDeletionBtn”,点击它后,我们会检查是否启用了“GarbageMode”,如果是,我们将进行一些基本验证来检查是否被删除的控件不是我们的“Delete”或“GarbageModeToggle”按钮本身(如果用户双击“Delete”按钮,这可能会导致问题)。之后,它将删除/处置要删除的控件。

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;
    }
}

进一步阅读:

【讨论】:

  • 应用程序应该知道您点击了哪个控件....对于“选择”,我的意思是应用程序知道您点击了哪个控件所以 OP 想知道哪个按钮S 被点击了,而不是当前关注的是哪一个。
  • @JohnWu OP 在他的问题中提到“应用程序知道点击了哪个‘控件’”而不是按钮,所以这是你自己添加的。其次,通过简单的逻辑,可以很容易地跟踪之前选择的“控件”,如果使用了焦点事件,就像我演示的那样。
  • @JohnWu 不管怎样,我已经更新了我的答案,所以你现在可以删除你的反对票。
【解决方案2】:

首先,您需要在某个地方跟踪“选择”(单击)的控件。因此,将其添加到表单的代码隐藏中:

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

【讨论】:

  • 那么按照这个逻辑,如果一个表单上有20个控件,为了让它们“可删除”,我们必须为每个控件修改点击事件?
  • 不,你可以有一个通用的点击处理程序,如果你愿意,你可以在现有的处理程序之上添加它。一个控件可以有多个事件处理程序,没问题。即使只有一个处理程序,您也可以通过转换 sender 来判断是哪个控件导致了事件,如示例中所示。
  • 非常感谢!但是,如果我想再次单击取消选择控件怎么办? (就像您已经选择了一个,但您犯了一个错误并想通过其他点击取消选择该控件)
  • 你只需要做类似if (_itemsToDelete.Contains(sender)) _itemsToDelete.Remove(sender) else _itemsToDelete.Add(sender)
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多