有这样一个场景,有AB两个客户总对界面摆放有着不同的喜好,一个喜欢查询条件输入区(被放在一个groupbox中)在界面的上半部分,输入区在下半部分(被放在另一个groupbox中),另一个用户则正好相反,所以我们在界面设计确认时今天A在时,我们听他的要求,改一次,明天A去开会了,B来确认,又让我们改回来,几次下来,觉得很痛苦,如果界面有区多的区域,比如说一个查询条件输入区、一个业务数据录入区、一个输出区,这种情况下,客户的喜好更是会让你左改右改,所以我们最后决定提供以GroupBox为单位的,运行时可拖拽上下位置的功能,让不同的客户根据自己的喜好去拖拽,我们后台自动保存设定就是了。
场景描述很复杂,但代码实现却很简练:
一个全权负责拖放管理的类实现:
using System;
using System.Windows.Forms;
namespace Subindex
{
/// <summary>
///
/// </summary>
public class DragDropAgent//4 groupBox control in runtime dragDrop support, Written By Linnet 2006-4-6
{
private DragDropAgent()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 得到一个包含首层父控件的控件的对象名,如form1下groupbox1中的textbox1,将返回form1.textbox1
/// </summary>
/// <param name="sender">要获得对象名的控件实例</param>
/// <returns></returns>
public static string getFullName(Control sender)
{
string name=sender.Name;
while (sender.Parent!=null)
sender=sender.Parent;
return sender.Name+"."+name;
}
/// <summary>
/// 设置指定GroupBox控件的拖放操作,根据CanDrag和CanDrop决定拖出/放入的支持
/// </summary>
/// <param name="sender">要设置拖放特性的GroupBox对象</param>
/// <param name="CanDrag">是否可以拖出</param>
/// <param name="CanDrop">是否可以放入</param>
public static void DragDropHook(GroupBox sender,bool CanDrag,bool CanDrop)
{
if (CanDrag) DragHook(sender);
if (CanDrop) DropHook(sender);
gutPosition(sender);
}
/// <summary>
/// 设置指定GroupB