PC6下载站

分类分类

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

关注+2009-04-07作者:

.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 浮动控件公共操作
        //另外组件中还添加了几个事件,

 

展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消