博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『原创』让.Net CF实现智能提示(AutoComplete)功能
阅读量:5140 次
发布时间:2019-06-13

本文共 2605 字,大约阅读时间需要 8 分钟。

前言

最近,一直在做Winform方面的开发,有一个公交信息查询的场景,用户在起始站输入框输入部分站点名称,系统能够自动给他建议和提示,类似Google中的自动补全、智能提示之类的功能,在Winform或者WebForm下,.Net都提供了不错的解决方案,甚至可以直接用Ajax中的AutoComplete控件。

但是,问题来了,这个功能要移植到WM平台,我们平常在使用WM手机都可以知道,输入是一件比较麻烦的事情,总是喜欢点点、滑滑、拖拖……反正就是不喜欢输入吧……平常查公交站点,在谷歌里面,都是输入几个关键字就能“被”补全,也许,我有时候都不记得站点的全名了>_<|||。

本想直接用Combox的,发现其没有自动补全功能,谷歌百度一把,发现没有太好的“轮子”,于是,我只有自己造一个带自动补全功能的Combox了。

正文

虽然没有正式的去研究过AutoComplete这个功能,不过,自己想想,也能山寨一个吧。我的思路如下:

  1. 先把站点列表填充好,等待用户输入的关键词
  2. 用户输入关键词,每输入一个字,进行站点列表遍历,查找符合条件的站点,并把它们加入“候补列表”
  3. 用户可以通过Combox的下拉按钮展开Items,查看系统给出的“建议”站点
  4. 用户修改关键词,系统重新比对、填充“候补列表”
  5. 用户关键词越详细,候补列表越精确

有了思路,好像还不错,于是就开始Coding吧。和所有WM项目一样,在设计界面,拖放一个Combox控件到窗体内,并设置Combox的Dock为Top。就这么简单吧。当然,在这里,我们还是一切从简,我没有把站点数据库加载到程序中(实际上,客户下载了程序后,自带了一个SQLite数据库存储站点信息),各位看了我的代码,估计基本能够理解了吧。

定义两个泛型变量,用于存储List信息:

 

代码
 
1
///
<summary>
2
///
这个List用于存放站点列表,实际中
3
///
站点可能是字符串类型也可能是整型,视具体情况而定
4
///
</summary>
5
 
private
List
<
string
>
liStops;
6
///
<summary>
7
///
这个List用于存放候选的站点,也即自动补全的建议项
8
///
类似于google的候选项目
9
///
</summary>
10
 
private
List
<
string
>
liSuggest;

 

 

关键的AutoComplete代码(个人感觉山寨到不行……cbInput为Combox控件):

AutoComplete代码
 
1
///
<summary>
2
///
此方法用于自动补全Combox的Items,让Items的项目和用户输入的
3
///
关键字相匹配
4
///
</summary>
5
///
<param name="text">
用户输入的关键字/词
</param>
6
 
private
void
FillListBox(
string
text)
7
{
8
9
foreach
(
string
item
in
liStops)
10
{
11
if
(item.IndexOf(text)
>
-
1
)
//
如果该站点包含关键词,则往候补Items中添加这个站点
12
 
{
13
liSuggest.Add(item);
14
}
15
}
16
17
foreach
(
object
obj
in
liSuggest)
//
把候补List中的项目填充到Combox中,让用户感觉是Combox自动完成填补
18
 
{
19
cbInput.Items.Add(obj.ToString());
20
}
21
}

 

然后,为Combox的KeyUp事件添加如下代码:

 

代码
 
1
private
void
cbInput_KeyUp(
object
sender, KeyEventArgs e)
2
{
3
liSuggest
=
new
List
<
string
>
();
4
liSuggest.Clear();
//
清空上一次的候补项目
5
 
6
cbInput.Items.Clear();
7
string
text
=
null
;
8
switch
(e.KeyCode)
//
获取本次用户按下的按钮code
9
 
{
10
case
Keys.Left:
11
case
Keys.Up:
12
case
Keys.Right:
13
case
Keys.Down:
14
case
Keys.Delete:
15
return
;
16
default
:
17
text
=
cbInput.Text.Trim();
18
FillListBox(text);
19
break
;
20
}
21
}

 

注意,为了简化操作,我的站点列表在Form_Load事件中进行填充:

 

Form_Load代码
 
1
private
void
Form1_Load(
object
sender, System.EventArgs e)
2
{
3
liStops
=
new
List
<
string
>
();
4
for
(
int
i
=
0
; i
<
299
; i
++
)
//
我定义了窗体Load时,填充站点List,实际中,我们需要选择最佳时机来填充这个List
5
 
{
6
liStops.Add(i.ToString());
7
}
8
}

 

Ok,至此,一个.Net CF版带AutoComplete功能的、山寨的Combox就实现了。效果如下,感觉还不错……

 

好了,演示结束,实际上,使用中发现,站点列表用什么方式、怎么放到Combox的Items中是一个很有意思的问题,它会影响到用户体验,比如动态加载的时候会有明显延时,都待大家讨论了哦……Jack就暂时先写到这里吧。

最后,推荐一篇的文章 虽然有点年头,不过,很值得一品!

也许,你也应该到这里看看dalelane朋友的这篇文章,也许,这就是正牌的AutoComplete了吧:

转载于:https://www.cnblogs.com/longqi293/archive/2010/09/15/WindowsMobile-AutoComplete.html

你可能感兴趣的文章
mysql绑定参数bind_param原理以及防SQL注入
查看>>
#Leetcode# 237. Delete Node in a Linked List
查看>>
交叉编译zookeeper的C库
查看>>
电视盒子和网线选择
查看>>
发现一sonar-runner bug
查看>>
SpringBoot整合SpringData和Mysql数据库
查看>>
C++ 构造函数后加冒号
查看>>
centos7下安装mysql8.0
查看>>
npm源设置
查看>>
eclipse中定位引用的源码
查看>>
windows之电脑开机出现 this product is covered by one or more of the following prtents
查看>>
数据库冗余是否必要
查看>>
split()分割字符串用法
查看>>
modish产品介绍
查看>>
servlet 启动加载配置文件及初始化
查看>>
Beautiful Soup模块
查看>>
实验四
查看>>
OGNL
查看>>
win32 treeview
查看>>
day01
查看>>