如何使用ctrl键+鼠标单击选择多个控件?

时间:2014-05-20 07:40:56

标签: c# drag-and-drop keyboard keyboard-shortcuts

这个问题可能已经有了答案,但我无法找到它。 我在每个标签页中都有一个带有flowlayoutpanel的tabControl,我可以在运行时添加控件。我可以重新排列它们,将它们移动到标签页面上。如何使用ctrl键+鼠标点击选择多个控件以便能够移动它们?

到目前为止,这是我的拖拽事件:

private void control_DragDrop(object sender, DragEventArgs e)
    {
        Control target = new Control();

        target.Parent = sender as Control;

        if (target != null)
        {
            int targetIndex = FindCSTIndex(target.Parent);
            if (targetIndex != -1)
            {
                string cst_ctrl = typeof(CustomControl).FullName;
                if (e.Data.GetDataPresent(cst_ctrl))
                {
                    Button source = new Button();
                    source.Parent = e.Data.GetData(cst_ctrl) as CustomControl;

                    if (targetIndex != -1)

                        fl_panel = (FlowLayoutPanel)tabControl1.SelectedTab.Controls[0];
                    if (source.Parent.Parent.Name == target.Parent.Parent.Parent.Name)
                    {
                        this.fl_panel.Controls.SetChildIndex(source.Parent, targetIndex);
                    }
                    else
                    {
                        target.Parent.Parent.Parent.Controls.Add(source.Parent);
                        this.fl_panel.Controls.SetChildIndex(source.Parent, targetIndex);
                    }
                }
            }
        }
    }

    private int FindCSTIndex(Control cst_ctr)
    {
        fl_panel = (FlowLayoutPanel)tabControl1.SelectedTab.Controls[0];
        for (int i = 0; i < this.fl_panel.Controls.Count; i++)
        {
            CustomControl target = this.fl_panel.Controls[i] as CustomControl;

            if (cst_ctr.Parent == target)
                return i;
        }
        return -1;
    }

1 个答案:

答案 0 :(得分:0)

这不是一件容易的事情,也不是一项常见的任务。但肯定是可行的,取决于前提条件可能变得微不足道,而不需要花费多年的努力^^。

您有很多选择:

  • 控制支持选择;
  • 容器控件支持子控件选择;
  • 覆盖。

处理选择非常简单:如果选择了控件,是否有字典(或控件属性,可能使用Tag)存储,以某种方式显示选择,当控件为 Ctrl 时 - 单击反转选择。您甚至可以提供 Shift -key选择。

正如@Hans Passant评论的那样,您可以使用叠加窗口(在所有内容的顶部隐藏窗口)在那里绘制选择标线以及处理选择和拖动自身。或者它可以是具有属性IsSelected的自定义控件,设置将绘制某些内容(边框?)以指示选择。

最简单的选择是创建SelectionPanel控件,它可以托管其中的任何其他控件,具有IsSelected指示并且可拖动。添加子项时,订阅MouseUp / MouseDown个事件,或者只有在点击SelectionPanel的特殊区域时才允许拖动。例如,您可以在软件中选择启用拖动,设置后所有SelectionPanel将显示可以拖动的特殊区域(标题?)或 Ctrl -Click。