WinForm 的智能提示,该怎么实现呢? 这个我在CodeProject看过一个大牛做的类似的东西,还是有些难度,你上CodeProject 搜索 Intellisense popup, 找那篇文章看看。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 3楼的思路其实不错,其实所有匹配的数据也不多,不到1000条,是可行的。但是如果不是数据库查询,就是搞成这个智能提示的列表是动态的(服务器获取(缓存)或者本地文件),不是固定的源,该怎么搞呢。没有类似Web 的ajax 机制去获取么?WinForm 有类似Jquery 的AutoComplete 的组件可以用么?谢谢! 没看懂你这个动态的是怎么个动态法,输入过一次的内容自动保存下来以便下次再次输入?把它更新回数据源里同时insert到数据库或文件 就是说 AutoCompleteStringCollection 是动态的数据(根据用户输入内容服务器获取不同AutoCompleteStringCollection ),不是固定的。 http://bbs.csdn.net/topics/390324804看看这个 winform,如果数据不是太大,就在本地搞个数据缓存 ComboBox有个AutoCompleteCustomSource,AutoCompleteMode,AutoCompleteSource设置好数据源。设置一下DropDownStyle=DropDown即能自动补充,又能保留下拉列表的功能 http://blog.csdn.net/wangyue4/article/details/5985371FYI 此为正解。百度等搜索引擎,是有数据中心专门提供服务的。每次改变输入,都会进行输入匹配。其实就是一个一对多的哈希表,key就是输入框的所有内容,value为返回值。有时候输入太长太偏,就没有自动提示了~~所以响应快。单机或者单个服务器的话,是无法承受这巨大的一对多哈希表的,从数据库通过like查询,效率低,全文索引也难搞,所以1w条记录以上就会很卡。。---至于所谓的输入1就去表1查,输入2就去表2查这肯定要对用户透明,而且要考虑所有合法/非法输入。。 神马意思我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据??是的就是这个意思那你需要先确定好规则啊,否则怎么知道该什么时候去什么地方搜索呢数据的问题好说啊,缓存机制或者索引 都可以很快速的得到数据。但是客户端怎么去动态的加载这个提示的数据列表呢?我是很多动态生成 的TextBox 列表,不只一个需要这个智能提示。 补18楼:就是dongtai获取数据之后怎么在客户端呈现出来,让用户可以点击选择自动填入TextBox。 你的那些代码不是写在TextChanged事件处理程序里的。那些绑定在TextBox动态生成的时候写一遍就可以了。至于你说“我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据”的问题,我建议你一开始绑定的就是表一和表二的数据集的和,因为这个动态补充本来就是取前面一样的补充 我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据假定 表1中 有11、12、21、22 表2中有13、14、23、24那你在绑定TextBox的AutoCompleteCustomSource的时候,绑定表1、表2的数据集和,把不符合要求的如表1中的21、22,表2中13、14数据都筛除,绑定所有符合要求的数据,只绑定一次TextBox的TextChanged事件不要了。 先不考虑如何去加载的问题现在最大的问题是,你有多个列表,你如何确定该加载哪个列表??我输入飞机,你去列表1里检索,我输入坦克,你去列表2里检索?那你是否还需要有个列表来存放什么信息到什么表里去检索呢?我在想怎么动态绑定这个AutoComplete,就是怎么检索先不管,那么这个AutoCompleteCustomSource 我可以在客户端改变么?我想问这个。 现在是按照你说的实现的,form 加载的时候一次绑定好AutoCompleteCustomSource。后面不变。我是想问,TextBox 的AutoCompleteCustomSource 可以改变么? 我想是可以修改的,http://bbs.csdn.net/topics/390324804里面的例子,先Clear一下,再绑定。只是不能在TextChanged事件里面改,也就是修改的时候TextBox里面的内容不能改变,否则就冲突了。 我想是可以修改的,http://bbs.csdn.net/topics/390324804里面的例子,先Clear一下,再绑定。只是不能在TextChanged事件里面改,也就是修改的时候TextBox里面的内容不能改变,否则就冲突了。是冲突,因为在TextChanged 的时候系统默认是要智能提示的,所以这个时候 AutoCompleteCustomSource 是要锁定的。如果修改 就会冲突出错。那在 焦点移除事件的时候修改这个应该没有问题。但是这样不会的到想要的效果。有没有一种机制让某个事件在另外的事件执行完之后执行? 比如,可以先执行TextChanged 在这里面控制 智能提示先不要 动作,我修改完 AutoCompleteCustomSource 再让他执行智能提示呢? [/i]现在是这么搞的。 Auto[i]CompleteCustomSource 看来不好搞我说的那个效果了。 那可不可以用一个控件代替 Auto[i]CompleteCustomSource 的下拉提示? 比如 panel,可以动态改变这个panel的 内容、位置和Visible? 这样要添加很多事件处理,但应该可以实现吧? 这些功能都是跟不上时代的。winform这么些年真正升级过吗?你应该使用wpf。我想是可以修改的,http://bbs.csdn.net/topics/390324804里面的例子,先Clear一下,再绑定。只是不能在TextChanged事件里面改,也就是修改的时候TextBox里面的内容不能改变,否则就冲突了。是冲突,因为在TextChanged 的时候系统默认是要智能提示的,所以这个时候 AutoCompleteCustomSource 是要锁定的。如果修改 就会冲突出错。那在 焦点移除事件的时候修改这个应该没有问题。但是这样不会的到想要的效果。有没有一种机制让某个事件在另外的事件执行完之后执行? 比如,可以先执行TextChanged 在这里面控制 智能提示先不要 动作,我修改完 AutoCompleteCustomSource 再让他执行智能提示呢?除非扔掉它,另找第三方控件。 这些年我们见过的 autocomplete 功能,都习惯于:1. 它可以索引大量数据。2. 输入几个字符只后才开始提示。3. 每次提示20个就够了,不用全都给列出来。4. 可以实时访问远程数据库而产生(20条)提示内容。而不是在初始化时取来所有可能的提示内容。 1、2、3好说,都是要求。但是4实现起来有点难啊:访问数据库的时候,关键是数据库查询能否使用上索引?走与不走索引,效率要差上不止几个数量级。而查询的输入为不固定文本,简单处理就是like查询,不走列索引的。超过10w条记录基本3秒响应就不要指望了。建立全文索引,能否解决这个问题?目测也不理想。 智能提示问题的实现//TextBox文本框提示不能为空 <asp:TextBox ID="txtName" runat="server" BackColor="White" Height="20px" MaxLength="8" Rows="1" Width="150px" AutoPostBack="True" onFocus="tName();" OnTextChanged="txtName_TextChanged"></asp:TextBox> <asp:RequiredFieldValidator ID="rfvName" runat="server" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="用户名不能为空" Font-Size="9pt" ForeColor="#0000CC"></asp:RequiredFieldValidator>//js提示输入格式问题 function tName() { document.getElementById("sp1").innerHTML="只能输入数字、字母下划线,<br>例如:mr_2023"; }//codego.net/tags/11/1///密码输入设置 <asp:TextBox ID="txtPass" runat="server" BackColor="White" Height="20px" MaxLength="8" Rows="1" Width="150px" onchange="passHint()" onFocus="tPass();" TextMode="Password"></asp:TextBox>//密码不能为空设置 <asp:RequiredFieldValidator ID="txtPwd" runat="server" ControlToValidate="txtPass" Display="Dynamic" ErrorMessage="密码不能为空" Font-Size="9pt" ForeColor="#0000CC"></asp:RequiredFieldValidator>//js提示密码强弱设置 function passHint() { var txt=document.getElementById('txtPass').value; if(txt.length<6) { document.getElementById("labEbb").innerHTML="密码强度:弱"; }else { document.getElementById("labEbb").innerHTML="密码强度:强"; } if(txt.length==0) { document.getElementById("labEbb").innerHTML=""; document.getElementById("labEbb").innerHTML=""; } }//强弱提示显示 <asp:Label ID="labEbb" runat="server" Font-Size="12px" ForeColor="Blue" Height="16px" Width="77px"></asp:Label><span id="sp2" style="font-size: 12px; color: Blue"></span>//js提示输入位数 function tPass() { document.getElementById("sp1").innerHTML="密码应在6位以上。"; } 正则表达式 获取img中的src值,不能理解的问题 DataGridView 不显示数据 c#里的模态对话框,点确定如果不关闭!!!,急求方法 如何将combBox选择的Item赋给一个变量~ 哎。。头大了,问个发布的问题 关于 process 问题,达人快进来! To版主和大版主们,烦人的 CSDN 广告, 评评理!!! c#做应用程序!!!! c#2个变量值始终都是一样的 有C\C++基础和一点Java基础,学习C#并进而能开发一些小项目,大约要多长时间?(大虾进!) 请教一个SQL语句~ winform如何打印预览VF做的报表格式
但是如果不是数据库查询,就是搞成这个智能提示的列表是动态的(服务器获取(缓存)或者本地文件),不是固定的源,该怎么搞呢。
没有类似Web 的ajax 机制去获取么?WinForm 有类似Jquery 的AutoComplete 的组件可以用么?谢谢!
设置好数据源。设置一下DropDownStyle=DropDown即能自动补充,又能保留下拉列表的功能
FYI
此为正解。百度等搜索引擎,是有数据中心专门提供服务的。每次改变输入,都会进行输入匹配。其实就是一个一对多的哈希表,key就是输入框的所有内容,value为返回值。有时候输入太长太偏,就没有自动提示了~~所以响应快。单机或者单个服务器的话,是无法承受这巨大的一对多哈希表的,从数据库通过like查询,效率低,全文索引也难搞,所以1w条记录以上就会很卡。。---
至于所谓的输入1就去表1查,输入2就去表2查这肯定要对用户透明,而且要考虑所有合法/非法输入。。
我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据??是的就是这个意思
那你需要先确定好规则啊,否则怎么知道该什么时候去什么地方搜索呢数据的问题好说啊,缓存机制或者索引 都可以很快速的得到数据。但是客户端怎么去动态的加载这个提示的数据列表呢?我是很多动态生成 的TextBox 列表,不只一个需要这个智能提示。
那些绑定在TextBox动态生成的时候写一遍就可以了。至于你说“我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据”的问题,我建议你一开始绑定的就是表一和表二的数据集的和,因为这个动态补充本来就是取前面一样的补充
假定 表1中 有11、12、21、22
表2中有13、14、23、24那你在绑定TextBox的AutoCompleteCustomSource的时候,绑定表1、表2的数据集和,把不符合要求的如表1中的21、22,表2中13、14数据都筛除,绑定所有符合要求的数据,只绑定一次TextBox的TextChanged事件不要了。
现在最大的问题是,你有多个列表,你如何确定该加载哪个列表??
我输入飞机,你去列表1里检索,我输入坦克,你去列表2里检索?那你是否还需要有个列表来存放什么信息到什么表里去检索呢?我在想怎么动态绑定这个AutoComplete,就是怎么检索先不管,那么这个AutoCompleteCustomSource 我可以在客户端改变么?
我想问这个。
我是想问,TextBox 的AutoCompleteCustomSource 可以改变么?
是冲突,因为在TextChanged 的时候系统默认是要智能提示的,所以这个时候 AutoCompleteCustomSource 是要锁定的。
如果修改 就会冲突出错。
那在 焦点移除事件的时候修改这个应该没有问题。但是这样不会的到想要的效果。
有没有一种机制让某个事件在另外的事件执行完之后执行? 比如,可以先执行TextChanged 在这里面控制 智能提示先不要 动作,我修改完 AutoCompleteCustomSource 再让他执行智能提示呢?
现在是这么搞的。 Auto[i]CompleteCustomSource 看来不好搞我说的那个效果了。 那可不可以用一个控件代替 Auto[i]CompleteCustomSource 的下拉提示? 比如 panel,可以动态改变这个panel的 内容、位置和Visible? 这样要添加很多事件处理,但应该可以实现吧?
是冲突,因为在TextChanged 的时候系统默认是要智能提示的,所以这个时候 AutoCompleteCustomSource 是要锁定的。
如果修改 就会冲突出错。
那在 焦点移除事件的时候修改这个应该没有问题。但是这样不会的到想要的效果。
有没有一种机制让某个事件在另外的事件执行完之后执行? 比如,可以先执行TextChanged 在这里面控制 智能提示先不要 动作,我修改完 AutoCompleteCustomSource 再让他执行智能提示呢?除非扔掉它,另找第三方控件。
2. 输入几个字符只后才开始提示。
3. 每次提示20个就够了,不用全都给列出来。
4. 可以实时访问远程数据库而产生(20条)提示内容。而不是在初始化时取来所有可能的提示内容。
1、2、3好说,都是要求。
但是4实现起来有点难啊:
访问数据库的时候,关键是数据库查询能否使用上索引?走与不走索引,效率要差上不止几个数量级。
而查询的输入为不固定文本,简单处理就是like查询,不走列索引的。超过10w条记录基本3秒响应就不要指望了。建立全文索引,能否解决这个问题?目测也不理想。
//TextBox文本框提示不能为空
<asp:TextBox ID="txtName" runat="server" BackColor="White" Height="20px" MaxLength="8"
Rows="1" Width="150px" AutoPostBack="True" onFocus="tName();" OnTextChanged="txtName_TextChanged"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvName" runat="server" ControlToValidate="txtName"
Display="Dynamic" ErrorMessage="用户名不能为空" Font-Size="9pt" ForeColor="#0000CC"></asp:RequiredFieldValidator>
//js提示输入格式问题
function tName()
{
document.getElementById("sp1").innerHTML="只能输入数字、字母下划线,<br>例如:mr_2023";
}//codego.net/tags/11/1/
//密码输入设置
<asp:TextBox ID="txtPass" runat="server" BackColor="White" Height="20px" MaxLength="8"
Rows="1" Width="150px" onchange="passHint()" onFocus="tPass();" TextMode="Password"></asp:TextBox>
//密码不能为空设置
<asp:RequiredFieldValidator ID="txtPwd" runat="server" ControlToValidate="txtPass"
Display="Dynamic" ErrorMessage="密码不能为空" Font-Size="9pt" ForeColor="#0000CC"></asp:RequiredFieldValidator>
//js提示密码强弱设置
function passHint()
{
var txt=document.getElementById('txtPass').value;
if(txt.length<6)
{
document.getElementById("labEbb").innerHTML="密码强度:弱";
}else
{
document.getElementById("labEbb").innerHTML="密码强度:强";
}
if(txt.length==0)
{
document.getElementById("labEbb").innerHTML="";
document.getElementById("labEbb").innerHTML="";
}
}
//强弱提示显示
<asp:Label ID="labEbb" runat="server" Font-Size="12px" ForeColor="Blue" Height="16px"
Width="77px"></asp:Label><span id="sp2" style="font-size: 12px; color: Blue"></span>
//js提示输入位数
function tPass()
{
document.getElementById("sp1").innerHTML="密码应在6位以上。";
}