自定义下拉列表控件

  1. 问题及需求
  • 输入汉字或全拼或简拼均可得到结果(此需求用原生的ComboBox不容易实现)
  • 点击文本框时弹出下拉列表
  • 进入文本框时弹出下拉列表
  • 输入文字时,如果有结果,则弹出下拉列表
  • 除文本框和下拉列表外,点击任何地方均隐藏下拉列表
  • 单击下拉列表中的文字,文本出现在文本框,关闭下拉列表
  • 下拉列表出现后,默认选中第一项,第一项高亮
  • 回车后下拉列表中选中的文本出现在文本框中

2.解决思路

  • 用Panel作为容器,装载ListView,作为下拉列表的数据容器
  • 定义下拉列表显示方法,并使用+=将其添加到文本框的Enter和Click事件后
  • 使用DataTable的Select方法过滤数据,并将其赋值给ListView的DataSource
  • 使用windows消息机制过滤消息,获得鼠标所在位置的控件,判断是否文本框和ListView控件,如果是,不处理,如果不是,则隐藏下拉列表
  • 文本框中回车时,取ListView选中的项的值,并赋给文本框

3.代码

以下是核心代码:

使控件所在form继承IMessageFilter,并实现bool PreFilterMessage(ref Message m)方法

public bool PreFilterMessage(ref System.Windows.Forms.Message message)
        {
            int hwnd = 0;
            StringBuilder winText = new StringBuilder();
            StringBuilder clsName = new StringBuilder();
            StringBuilder pText = new StringBuilder();

//获取鼠标所在位置获取窗体或控件的信息,包括Handle,窗体(控件)的标题,窗体(控件)的类名,父容器的标题
            APImouse.GetWindowFromPoint(ref hwnd, ref winText, ref clsName, ref pText);

            // 鼠标左键消息
            if (message.Msg >= 513 && message.Msg <= 515)
            {
                if (hwnd != (int)listBox1.Handle && hwnd != (int)tbBrand.Handle)
                    pnlBrandList.Visible = false;
            }

            return false;
        }

public struct POINT
    {
        public int x;
        public int y;
    }

    public class APImouse
    {
        [DllImport("user32.dll", EntryPoint = "GetCursorPos")]
        public static extern int GetCursorPos(ref POINT lpPoint);
        [DllImport("user32.dll", EntryPoint = "WindowFromPoint")]//指定坐标处窗体句柄
        public static extern int WindowFromPoint(int xPoint, int yPoint);
        [DllImport("user32.dll", EntryPoint = "GetWindowText")]//指定坐标处窗体标题
        public static extern int GetWindowText(int hwnd, string lpString, int cch);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetParent(int hWnd);

        public static void GetWindowFromPoint(ref int hwnd, ref StringBuilder winText, ref StringBuilder clsName, ref StringBuilder pText)
        {

            int parentHandle = 0;
            int maxLen = 128;

            POINT pnt = new POINT();

            parentHandle = GetCursorPos(ref pnt);

            hwnd = WindowFromPoint(pnt.x, pnt.y);

            winText = new StringBuilder(maxLen);

            parentHandle = GetWindowText(hwnd, winText.ToString(), maxLen);

            clsName = new StringBuilder(maxLen);

            parentHandle = GetClassName(hwnd, clsName, maxLen);

            pText = new StringBuilder(maxLen);

            parentHandle = GetParent(hwnd);

            parentHandle = GetWindowText(parentHandle, pText.ToString(), maxLen);
        }
    }

  

自定义下拉列表控件

时间: 2024-10-14 15:43:36

自定义下拉列表控件的相关文章

ASP.NET自定义Web服务器控件-DropDownList/Select下拉列表控件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //自定义web服务器控件-下拉列表 namespace MyControls { [DefaultProperty("Tex

自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题

自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题 欢迎关注http://blog.csdn.net/aaa123524457 转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675 在做项目的时候,用到了ComboBox来做下拉列表的功能:但是在用的时候发现C#自带的ComboBox效率非常的慢! 当然我添加的是股票.期货的合约数据,大概有几千条信息,算是比较大的.如果用到的数据很少,就可以直

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

自定义组合控件和在自定义控件中使用自定义属性

今天,整理了一下我平时的笔记,写一个比较简单的自定义组合控件,仅供小白参考,大神请绕道,希望能够对大家有一些帮助 首先,得明白为什么我们需要自定义组合控件,它是因为原有控件并不能满足开发的需求,或者说并不能达到我们想要的一种效果,这个时候,就需要我们自己定义一些控件,以达到目的 ![先来看一下效果](http://img.blog.csdn.net/20160716224219109) 个人总结自定义控件的步骤: 1.先写一个布局,这里我用的是一个相对布局,我这里的相对布局就是根布局了 <?xm

自定义HtmlHelper控件

在asp.net mvc 中每一个Html控件都返回了MvcHtmlString ,他继承了HtmlString.下面自定义一个关于显示男女性别的自定义Html控件,使在创建页面时,可以直接调用该自定义的Html控件.可以查看其他的Html控件返回的是HtmlHelper,所以自定义的时候也要返回相同的类型直接在Controls文件夹下建立要自定义的html控件代码如下: using System.Web.Mvc; using System.Text; namespace System.Web.

【转】带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

原文网址:http://blog.csdn.net/harvic880925/article/details/40475367 前言:前一篇文章给大家展示了传统的Listview的写法,但有的时候我们并不想在DataHolder类中加一个标识是否选中的checked的成员变量,因为在项目开发中,大部分的ListItemLayout布局都是大家共用的,有些人根本不需要checkbox控件,所以会在初始化的时候把这个控件给隐藏掉,但我们的DataHolder在构造的时候以及ListItemAdapt

Android自定义组合控件--底部多按钮切换

效果图: 现在市场上大多数软件都是类似于上面的结构,底部有几个按钮用于切换到不同的界面.基于OOP思想,我想把下面的一整块布局封装成一个类,也就是我们的自定义组合控件-底部多按钮切换布局,我把它叫做BottomLayout 看上面的布局,几个按钮横向排列,我们先看一下布局 最外面LinearLayout 方向 horizontal,然后5个weight相同的RelativeLayout,每个RelativeLayout里面有一个Button(用了显示选中状态)个ImageView(用来显示红点)

Android_自定义切换控件SwitchView

今天做了一下老师给的第一套题,第一题是判断一个字符串是否在另一个字符串中:做了一下,感觉有好多种写法,java中的类真的好多啊,要掌握好一些基本类的用法: package com.exam.e120; public class java1 { public static void main(String[]args){ String str1,str2; str1="I am Tom, I am from China."; str2="Tom"; int i=str

C#自定义工业控件开发

转自阿凡卢原文C#自定义工业控件开发 由于工作需要,调研过一段时间的工业控制方面的"组态软件"(SCADA)的开发,组态软件常用于自动化工业控制领域,其中包括实时数据采集.数据储存.设备控制和数据展现等功能.其中工控组件的界面展现的实现类似于Windows系统下的各种开发控件,通过各种控件的组装,和硬件协议的集成,就可以实现对相应设备的控制和实时状态的显示. 每个对应的硬件UI展示都可以用一个自定义控件来实现,如下图的一个温度计,就可以使用UserControl来实现. using S