您的位置:首页技术开发.Net 专栏 → .NET组件多列下拉框和鼠标相关组件

.NET组件多列下拉框和鼠标相关组件

时间:2009/4/7 8:36:00来源:本站整理作者:我要评论(0)

.NET组件多列下拉框和鼠标相关组件

网页中浮动层的应用非常广泛,但Windows程序中却少有浮动层。难道Windows程序中不需要浮动层吗?根据不同的需要实现相应的功能,有人会觉得直接在界面上添加控件更简单,或者用对话窗口的方法实现是一样的,只要实现功能就可以了。当然,解决方法有很多种,这里给出采用浮动层的实现方式。比如在ComboBox控件中下拉选择项时,只能显示一列,而且项数很多的时候又不能查找,用一个带查找功能的多列下拉框会方便很多(如下图)。
多列下拉框

 有些地方需要显示多行信息,但空间却比较小,像TextBox控件的Text属性一样,采用一个下拉文本框来显示和编辑,会更加灵活。
多行编辑框
本示例包含三个组件,一个是提供下拉功能的组件DropdownComponent,一个是实现用鼠标移动控件位置的组件MovableComponent,一个是实现用鼠标调整控件大小的组件ResizableComponent。在示例中包含如何实现自定义可视化属性设计器UITypeEditor,如何将一个属性的值设置为多个枚举以及分解成多个枚举,如何实现类似ToolTip给其他控件添加属性的功能。

下面介绍各个组件的实现原理与要点:

下拉组件DropdownComponent

实现原理
1、点击ComboBox的下拉标志时,显示浮动控件
2、浮动控件失去焦点时,根据标志位判断是否隐藏控件
实现要点
1、需要将ComboBox控件的DropDownHeight属性设置为1(设置为0无效),避免出现多余的框
2、需要调整目标控件的显示位置,不能超出窗体的边框
3、可以根据需要不只针对ComboBox控件,只要在一个事件处理方法中显示浮动控件即可
该组件实现起来非常简单,主要是处理ComboBox控件的DropDown事件,以及浮动控件的Leave事件。
首先声明内部字段和属性

其中的FloatControlWidthMode属性用来指示浮动控件的宽度模式,当设置为UserDefine时,按照控件的设置尺寸显示,当设置为AutoWidth时,调整浮动控件的宽度与下拉框的宽度相等。
下面是下拉框事件处理以及相关的方法。其中将显示和隐藏方法重载了,一组是显示指定的控件,一组是用于显示外部控件,而且都设置为public。这里和之前用Label模拟网页链接的组件一样,可以根据需要选择是否公开方法,比如用其他控件控制显示浮动控件就必须用public。还有在显示浮动控件时,将浮动控件添加到窗体中,这是为了避免在其他容器中,浮动控件只显示一部分,添加到窗体后则可以完整显示,不会被其他容器遮挡。
 

 


        #region 浮动控件操作及事件处理

        
private void AddDropDownEventHandler()
        {
            
if (m_TargetComboBox != null)
            {
                TargetComboBox.DropDown 
+= new EventHandler(TargetComboBox_DropDown);
                
this.m_TargetComboBox.DropDownHeight = 1;
            }
        }

        
private void RemoveDropDownEventHandler()
        {
            
if (m_TargetComboBox != null)
            {
                TargetComboBox.DropDown 
-= new EventHandler(TargetComboBox_DropDown);
                
this.m_TargetComboBox.DropDownHeight = 106;
            }
        }

        
private void AddLeaveEventHanlder()
        {
            
if (m_FloatControl != null)
            {
                FloatControl.Leave 
+= new EventHandler(FloatControl_Leave);
                
this.m_FloatControl.Visible = false;
            }
        }

        
private void RemoveLeaveEventHandler()
        {
            
if (m_FloatControl != null)
            {
                FloatControl.Leave 
-= new EventHandler(FloatControl_Leave);
            }
        }

        
void FloatControl_Leave(object sender, EventArgs e)
        {
            
if (m_FloatControl != null && m_AutoHide)
                
this.HideFloatControl(this.m_FloatControl);
        }

        
void TargetComboBox_DropDown(object sender, EventArgs e)
        {
            
if (m_FloatControl != null)
                
this.ShowFloatControl(this.m_TargetComboBox, this.m_FloatControl);
        }

        
/// <summary>
        
/// 显示设置的浮动控件
        
/// </summary>
        public void ShowFloatControl()
        {
            
this.ShowFloatControl(this.m_TargetComboBox, this.m_FloatControl);
        }

        
/// <summary>
        
/// 隐藏设置的浮动控件
        
/// </summary>
        public void HideFloatControl()
        {
            
this.HideFloatControl(this.m_FloatControl);
        }

        
#endregion 浮动控件操作及事件处理


        
#region 浮动控件公共操作

        
/// <summary>
        
/// 显示指定的浮动控件
        
/// </summary>
        
/// <param name="DropdownControl">下拉控件,可以不是ComboBox</param>
        
/// <param name="FloatControl">要显示的控件</param>
        public void ShowFloatControl(Control DropdownControl, Control FloatControl)
        {
            
if (DropdownControl == null)
                
throw new ArgumentNullException("DropdownControl""指定的下拉控件为null。");

            
if (FloatControl == null)
                
throw new ArgumentNullException("FloatControl""指定要显示的浮动控件为null。");

            
if (this.OnFloatControlDisplayChanging(FloatControl).Cancel)
                
return;

            Form ParentForm 
= DropdownControl.FindForm();

            
//将浮动控件添加到窗体上
            if (!ParentForm.Controls.Contains(FloatControl))
                ParentForm.Controls.Add(FloatControl);

            
//调整浮动控件宽度
            if (this.m_FloatControlWidthMode == DropDownControlWidthModeEnum.AutoWidth)
                FloatControl.Width 
= DropdownControl.Width;

            
//计算坐标
            Control ParentControl = DropdownControl.Parent;
            
int intLeft = 0, intTop = 0;
            intLeft 
= DropdownControl.Left;
            intTop 
= DropdownControl.Top + DropdownControl.Height;

            
//获取相对窗体的位置
            while (ParentControl != ParentForm)
            {
                intLeft 
+= ParentControl.Left;
                intTop 
+= ParentControl.Top;
                ParentControl 
= ParentControl.Parent;
            }

            
//判断是否超出窗体范围
            if (intLeft + FloatControl.Width > ParentForm.Width)
            {
                
int intOffset = FloatControl.Width - DropdownControl.Width;
                
if (intLeft - intOffset > 0)
                {
                    intLeft 
-= intOffset;
                }
                
if (this.m_FloatControlWidthMode == DropDownControlWidthModeEnum.AutoWidth)
                    FloatControl.Width 
= FloatControl.Width - intOffset;
            }

            
if (intTop + FloatControl.Height > ParentForm.Height)
            {
                
int intOffset = FloatControl.Height + DropdownControl.Height;
                
if (intTop - intOffset > 0)
                {
                    intTop 
-= intOffset;
                }
            }

            
//设置浮动控件位置
            FloatControl.Left = intLeft;
            FloatControl.Top 
= intTop;

            
//显示浮动控件
            FloatControl.Visible = true;
            FloatControl.BringToFront();
            FloatControl.Select();

            
this.OnFloatControlDisplayChanged(FloatControl);
        }

        
/// <summary>
        
/// 隐藏指定的浮动控件
        
/// </summary>
        
/// <param name="FloatControl">要隐藏的控件</param>
        public void HideFloatControl(Control FloatControl)
        {
            
if (FloatControl == null)
                
throw new ArgumentNullException("FloatControl""指定要显示的浮动控件为null。");

            Form ParentForm 
= this.m_TargetComboBox.FindForm();
            
if (ParentForm.Controls.Contains(FloatControl))
            {
                
if (this.OnFloatControlDisplayChanging(FloatControl).Cancel)
                    
return;

                ParentForm.Controls.Remove(FloatControl);
                FloatControl.SendToBack();
                FloatControl.Visible 
= false;

                
this.OnFloatControlDisplayChanged(FloatControl);
            }
        }

        
#endregion 浮动控件公共操作
        //另外组件中还添加了几个事件,

 

相关视频

    没有数据

相关阅读 iPhone数据迁移怎么用 iOS 12.4数据迁移功能使用教程iqoo neo和iqoo哪个好 iqoo neo和iqoo对比一览iqoo neo手机发布会直播地址 iqoo neo发布会直播网址iPadOS beta 2下载 iPadOS beta 2固件下载地址iOS 13 beta 2下载 iOS 13 beta 2固件下载地址ios12.4beta2更新日志 ios12.4beta2更新了什么怪物猎人世界冰原iceborne多少钱 怪物猎人世界冰原iceborne收费价Genesis激活码怎么申请 Genesis创世争霸激活码获得方法

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 什么是.NET中的TDD?ASP.NET AJAX入门简介 WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用

人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题