最近项目有需求,就是把一个combobox让它可以根据用户输入的汉字就行模糊查询出匹配的下拉框内容,很简单,是吧

但是!!!在开发中真是遇到了不少问题呢。

一、实现流程

1)我的实现思维是这样的,先把combobox的DropDownStyle改为DropDown,让用户可以输入

2)在combobox的TextChanged方法中,根据用户输入的内容在查询出来的datatable中进行筛选,然后重新绑定combobox

具体代码:

/// <summary>
/// 根据输入的汉字来筛选配送企业
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmn_corp_TextChanged(object sender, EventArgs e)
{
if (!loading)//这个loading是为了确保在窗体load事件中,能够把combobox的绑定事件完全走完,要不获取combobox.selectedValue的值的时候会报错。
{
loading = true;
if (corpDt == null || corpDt.Rows.Count <= ) return;
string corpName = cmn_corp.Text.Trim();
DataView corpDv = DbHelper.GetDataView(corpDt);
if (corpDv == null) return;
corpDv.RowFilter = " company_name like '%" + corpName + "%'";
ComboBoxHelper.BindComboBox(corpDv.ToTable(), cmn_corp, "company_name", "company_id");
loading = false; //this.cmn_corp.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
//this.cmn_corp.AutoCompleteSource = AutoCompleteSource.ListItems;//这两行代码能大致实现问题,但是筛选只是从开头匹配,like 'XX%'
}
}

最后,实现不了,因为combobox的TextChanged方法对于中文,是这样的,你在combobox里面输入“天啊”,text取值的时候只能取到“天”,然后等到“天”有匹配,匹配好的时候,会再次触发TextChange事件,这次的Text的值就会是“啊”+匹配好的文字。说的有点乱,下面上图

这是下拉框未筛选的时候:

打算筛选“国药啊”,三个字

输入到文本框的只有“国”

第一次筛选“国”:

成功筛选:

刚才看到文本框里只有个“国”,是不是以为后面的汉字就没了,消失了?并没有哦~只不过筛选是一个字一个字来的,但是我们又不知道用户会输入几个字来筛选,所以不能把筛选的文字拼在一起之后再筛选,也不能在第一个能筛选出结果之后就不匹配后面的文字,就变成了后面的尴尬情况。后面的第一个字+上一个筛选出来的文字连在一起组成了再次筛选的条件。于是,问题就来了,这个拼出来的完全不对,也肯定筛不出来我们想要的数据。

错误的筛选文字筛选出的结果:没有匹配项

小总结:不知道是我写的方法有问题,还是combobox的TextChanged事件就是对中文输入法不友好,我想说,如果你用这个方法并且成功实现了功能,那么请你不要吝啬,大方的在评论区分享一下啦

*****************************&&&&&&&&&&&&&&*******************……………………………我是凌乱的分隔符………………………¥¥¥¥¥¥¥¥¥@@@@@@@@@@@@~~~~~~~~~~~~~~~~~~-------------------

二、为了实现上个功能,我不能用combobox但是可以拼出来嘛,于是我用textbox和listbox代替了combobox

还挺好用的,就是在最后listbox小坑了我一把。

我想的是在窗体加载的时候把listbox隐藏,然后等textbox获得焦点的时候,让listbox显示,等筛选完,选择结果之后,再把listbox隐藏。。。可素!在窗体加载完之后,listbox不见了,但是它的滚动条却还在!还有在窗体load事件执行完之后,它的隐藏没有任何问题,把滚动条小尾巴藏得妥妥的。所以会是load没执行完的问题吗?可是load执行完之后,窗体也显示出来了,用户也能看到了,还怎么隐藏呢?【纠结.jpg】

先贴实现代码,最后给你们上让人哭泣的效果图

/// <summary>
/// textbox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_corp_TextChanged(object sender, EventArgs e)
{
if (!loading)
{
loading = true;
if (corpDt == null || corpDt.Rows.Count <= ) return;
string corpName = txt_corp.Text.Trim();
DataView corpDv = DbHelper.GetDataView(corpDt);
if (corpDv == null) return;
if (corpName != "")
corpDv.RowFilter = " company_name like '%" + corpName + "%'";
else
corpDv.RowFilter = " 1=1";
lb_corp.DataSource = corpDv.ToTable();
lb_corp.Visible = true;
loading = false;
}
} /// <summary>
/// listbox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lb_corp_SelectedIndexChanged(object sender, EventArgs e)
{
if (!loading)
{
loading = true;
txt_corp.Text = "";
txt_corp.Text = lb_corp.Text;
txt_corp.SelectAll(); DataRowView drv = lb_corp.SelectedItem as DataRowView;
if (drv != null)
{
string id = drv[lb_corp.ValueMember].ToString();
}
lb_corp.Visible = false;
loading = false;
}
}

效果图:特意在qq上做了个动态图,可是不让上传,只能自己想象动起来了

好啦,最后的最后,我也只是发现了问题,但是没有解决,希望大佬们知道我哪里错了能够毫不留情的指出,Thanks♪(・ω・)ノ~

======================================我是后续的分割线==================================================================

今天又尝试了一下listbox的隐藏问题,想着既然load事件中不能完全隐藏,load之后的事件能完全隐藏,那能不能在load事件执行完之后的自动事件中写隐藏语句呢?然后发现有Activated和Shown两个事件备选。再后来Activated可能会执行多次,在窗体打开,关闭时都会触发,而我只需要显示就好,所以选择了shown事件

private void FormTBDD_Shown(object sender, EventArgs e)
{
lb_corp.Visible = false;
}

注意:此时listbox的Visible属性必须为true,并且在窗体的load事件中不能对Visible属性有修改操作,不然Shown事件中的

lb_corp.Visible = false; 不起作用

再次打开窗体的时候就能发现,哈哈哈,滚动条不见啦,不过还是有点小瑕疵,在窗体打开的瞬间会闪一下,其实就是那一瞬间把滚动条隐藏了。虽然不尽人意,但也算是个小进步吧,加油!

这是窗体打开的一瞬间,我快速截的图,哈哈,label的text还没有完全显示出来呢,呐,是不是可以看到滚动条真的没有了~~~~

												

VS 2013Ultimate 开发过程中遇到的问题——listbox的隐藏问题,combobox.textchanged的中文问题的更多相关文章

  1. 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法

    这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...

  2. SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率

    应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...

  3. web开发过程中经常用到的一些公共方法及操作

    进化成为程序猿也有段岁月了,所谓的经验,广度还是依旧,只不过是对于某种功能有了多种实现方式的想法.每天依旧不厌其烦的敲打着代码,每一行代码的回车似乎都有一种似曾相识的感觉.于是乎:粘贴复制,再粘贴再复 ...

  4. Eclipse开发过程中个VM Arguments的设置

    Eclipse开发过程中个VM Arguments的设置 1:jre中的Default VM Arguments: -Xms256M -Xmx640M -XX:PermSize=256m -XX:Ma ...

  5. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结

    开发<客户关系管理系统(CRM)>软件过程,也就是一个标准的Winform程序的开发过程,我们可以通过这个典型的软件开发过程来了解目前的开发思路.开发理念,以及一些必要的高效率手段.本篇随 ...

  6. 软件开发过程中的审查 (Review)

    http://blog.csdn.net/horkychen/article/details/5035769 软件开发过程中的审查 (Review)   希望别人做些什么->定义出流程 希望别人 ...

  7. javaweb开发过程中的地址写法

    凡是要表示web资源的地址,比如浏览器地址栏中,都是 /凡是要表示硬盘地址, 都是 \  public class ServletDemo1 extends HttpServlet { //实际开发过 ...

  8. SpringMVC开发过程中的中文乱码问题

    相信大家在开发初期遇到中文乱码问题一定是一头雾水,不是数据库乱码了就是页面乱码了或者传值时乱码.其实解决乱码的途径很简单,就是统一编码与解码的类型,我把自己遇到的乱码问题整理出来,希望能够对大家有用. ...

  9. net开发过程中Bin目录net开发过程中Bin目录下面几种文件

    .net开发过程中Bin目录下面几种文件格式的解释 在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..v ...

随机推荐

  1. 【bzoj 3495】PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...

  2. Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  3. VIM编辑器使用

  4. Java多线程访问共享资源类及类之间关系设计

    1.涉及的类 多线程类.共享资源存储类 2.类之间的关系 (1)共享资源存储类作为线程类的全局成员变量,在线程初始化时,通过setter或者构造注入(当然此处是同一个共享资源类对象),实现多个线程共享 ...

  5. MySQL数据库 Too many connections

    出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个, ...

  6. git 命令详细

    git是代码管理工具 github是基于git实现的代码管理平台 git --version 查看git版本 git remote -v 查看clone地址 git init 初始化git //全局设 ...

  7. C# - 引用类型

    引用类型(Reference Type) C#是一门使用OOP技术的编程语言(Object Oriented Programming 面向对象编程)面向对象最重要的特性就是接口.继承.多态 C#中所有 ...

  8. wireshark 抓包过滤器使用

    目录 wireshark 抓包过滤器 一.抓包过滤器 二.显示过滤器 整理自陈鑫杰老师的wireshark教程课 wireshark 抓包过滤器 过滤器分为抓包过滤器和显示过滤器,抓包过滤器会将不满足 ...

  9. 分享一个VueCli 3.0的项目模板

    个人搭建的Vue项目模板 默认自带  Vuex  Less 封装内容如下 vue.config axios 封装 vue 配置环境文件 vue 自定义路径映射 (cli3.0取消了默认@ 映射src的 ...

  10. codeforces 813E 主席树

    题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r] ...