Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ctrl键+;单击鼠标选择多个控件?_C#_Drag And Drop_Keyboard_Keyboard Shortcuts - Fatal编程技术网

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

C# 如何使用ctrl键+;单击鼠标选择多个控件?,c#,drag-and-drop,keyboard,keyboard-shortcuts,C#,Drag And Drop,Keyboard,Keyboard Shortcuts,也许这个问题在这里已经有了答案,但我没能找到。。 我有一个tabControl,在每个选项卡页面中都有一个flowlayoutpanel,可以在运行时添加控件。我可以重新排列它们,在标签页之间移动它们。。如何选择多个控件以使用ctrl键+鼠标单击来移动它们 这是迄今为止我的拖动事件: private void control_DragDrop(object sender, DragEventArgs e) { Control target = new Control();

也许这个问题在这里已经有了答案,但我没能找到。。 我有一个tabControl,在每个选项卡页面中都有一个flowlayoutpanel,可以在运行时添加控件。我可以重新排列它们,在标签页之间移动它们。。如何选择多个控件以使用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;
    }
private void control\u DragDrop(对象发送方,DragEventArgs e)
{
控制目标=新控制();
target.Parent=发送方作为控件;
如果(目标!=null)
{
int targetIndex=FindCSTIndex(target.Parent);
如果(targetIndex!=-1)
{
字符串cst_ctrl=typeof(CustomControl).FullName;
if(例如Data.GetDataPresent(cst_ctrl))
{
按钮源=新按钮();
source.Parent=e.Data.GetData(cst\u ctrl)作为CustomControl;
如果(targetIndex!=-1)
fl_面板=(FlowLayoutPanel)选项卡控件1.SelectedTab.Controls[0];
if(source.Parent.Parent.Name==target.Parent.Parent.Parent.Name)
{
这个.fl_面板控制.SetChildIndex(source.Parent,targetIndex);
}
其他的
{
target.Parent.Parent.Parent.Controls.Add(source.Parent);
这个.fl_面板控制.SetChildIndex(source.Parent,targetIndex);
}
}
}
}
}
专用int FindCSTIndex(控制中心)
{
fl_面板=(FlowLayoutPanel)选项卡控件1.SelectedTab.Controls[0];
对于(int i=0;i
这不是一项容易的任务,也不是一项常见的任务。但毫无疑问,可行和依赖先决条件可能变得微不足道,而无需花费多年的努力

您有很多选择:

  • 控制支持选择
  • 容器控件支持子控件选择
  • 覆盖层
处理选择非常简单:有一个字典(或一个控件属性,可能使用
标记
)来存储是否选择了控件,在按住Ctrl键单击控件时以某种方式显示选择反转选择。您甚至可以提供Shift键选择

正如@Hans Passant所评论的,您可以使用覆盖窗口(一切之上的不可见窗口)在那里绘制选择十字线,以及处理选择和拖动本身。或者,它可以是一个自定义控件,其属性
IsSelected
,设置将绘制一些东西(边框?)以指示选择


最简单的选择是创建
SelectionPanel
控件,该控件可以承载内部的任何其他控件,具有
IsSelected
指示并可拖动。添加子项时,请订阅
MouseUp
/
MouseDown
事件,或者仅在单击
SelectionPanel
的特殊区域时才允许拖动。例如,您可以在软件中设置“启用拖动”选项,当设置所有
SelectionPanel
s时,将显示特殊区域(标题?),您可以拖动或按Ctrl键单击该区域。

这是Visual Studio内置的设计器的一项功能。在运行时不支持这一点,表单的设计器视图与覆盖窗口完全不同,覆盖窗口可以显示选择矩形。仅仅点击一个控件已经让你头疼了,这当然会触发控件的MouseDown事件。VS designer是一项多人年的工作,而不是一个问题。利用设计师的优势是一件很重要的事情。