C# 如何使用ctrl键+;单击鼠标选择多个控件?
也许这个问题在这里已经有了答案,但我没能找到。。 我有一个tabControl,在每个选项卡页面中都有一个flowlayoutpanel,可以在运行时添加控件。我可以重新排列它们,在标签页之间移动它们。。如何选择多个控件以使用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();
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是一项多人年的工作,而不是一个问题。利用设计师的优势是一件很重要的事情。