前记:数据源来自页面的一个ComboBox的数据源List<Contract>集合

页面放置一个TextBox(搜索框)、ListBox(显示搜索出来的数据),ListBox位置位于TextBox正下方,初始化隐藏。

TextBox--->txtSearch  ListBox--->listBox1关于两个控件的事件,详见代码:

  1. #region  自能提示
  2. Point pList = new Point();
  3. private void txtSearch_TextChanged(object sender, EventArgs e)
  4. {
  5. if (this.txtSearch.Text.Trim() != "")
  6. {
  7. List<Contract> source = getDataTable(this.txtSearch.Text.Trim());
  8. BindList(source);
  9. this.listBox1.Visible = true;
  10. }
  11. else
  12. {
  13. this.listBox1.Items.Clear();
  14. this.listBox1.Visible = false;
  15. }
  16. }
  17. private void txtSearch_KeyDown(object sender, KeyEventArgs e)
  18. {
  19. if (e.KeyCode == Keys.Down && this.listBox1.Visible)
  20. {
  21. this.listBox1.Focus();
  22. if (this.listBox1.SelectedItems.Count > 0)
  23. {
  24. this.listBox1.SetSelected(this.listBox1.SelectedIndex, false);
  25. }
  26. if (this.listBox1.Items.Count > 0)
  27. {
  28. this.listBox1.SetSelected(0, true);
  29. }
  30. }
  31. }
  32. private void listBox1_MouseUp(object sender, MouseEventArgs e)
  33. {
  34. if (this.listBox1.SelectedItems.Count > 0)
  35. {
  36. this.txtSearch.Text = this.listBox1.Text;
  37. cboChoCont.Text = this.txtSearch.Text;
  38. this.listBox1.Visible = false;
  39. this.txtSearch.Focus();
  40. }
  41. }
  42. private void listBox1_MouseMove(object sender, MouseEventArgs e)
  43. {
  44. Point m = new Point(e.X, e.Y);
  45. int index = GetItemAt(this.listBox1, e.X, e.Y);
  46. if (this.listBox1.SelectedItems.Count > 0 && this.listBox1.SelectedIndex != index)
  47. {
  48. this.listBox1.SetSelected(this.listBox1.SelectedIndex, false);
  49. }
  50. if (index != -1 && this.listBox1.SelectedIndex != index)
  51. {
  52. this.listBox1.SetSelected(index, true);
  53. }
  54. }
  55. private void listBox1_KeyDown(object sender, KeyEventArgs e)
  56. {
  57. if (e.KeyCode == Keys.Enter && this.listBox1.Visible && this.listBox1.SelectedItems.Count > 0)
  58. {
  59. this.txtSearch.Text = this.listBox1.SelectedItems[0].ToString();
  60. this.cboChoCont.Text = this.txtSearch.Text;
  61. this.listBox1.Visible = false;
  62. this.txtSearch.Focus();
  63. }
  64. }
  65. private bool GetItemAt(Point Mousep, int index)
  66. {
  67. int ph = this.listBox1.GetItemHeight(index) * index;
  68. int ph1 = this.listBox1.GetItemHeight(index) * index + this.listBox1.GetItemHeight(index);
  69. if (Mousep.Y > ph && Mousep.Y < ph1 && Mousep.X > 0 && Mousep.X < this.listBox1.Width)
  70. {
  71. return true;
  72. }
  73. else
  74. {
  75. return false;
  76. }
  77. }
  78. private int GetItemAt(ListBox listBox, int X, int Y)
  79. {
  80. int index = -1;
  81. for (int i = 0; i < listBox.Items.Count; i++)
  82. {
  83. System.Drawing.Rectangle r = listBox.GetItemRectangle(i);
  84. if (r.Contains(new Point(X, Y)))
  85. {
  86. index = i; ;
  87. break;
  88. }
  89. }
  90. return index;
  91. }
  92. private void BindList(List<Contract> source)
  93. {
  94. this.listBox1.Items.Clear();
  95. for (int i = 0; i < source.Count; i++)
  96. {
  97. this.listBox1.Items.Add(source[i].Con_Name_Serial);
  98. }
  99. if (source.Count < 11)
  100. {
  101. this.listBox1.Height = 15 * source.Count + 15;
  102. }
  103. else
  104. {
  105. this.listBox1.Height = 150;
  106. }
  107. this.listBox1.Visible = true;
  108. }
  109. private List<Contract> getDataTable(string s)
  110. {
  111. List<Contract> searchList = new List<Contract>();
  112. int length = list.Count;
  113. for (int i = 0; i < length; i++)
  114. {
  115. if (list[i].Con_Name_Serial.IndexOf(s) == 0)
  116. searchList.Add(list[i]);
  117. }
  118. return searchList;
  119. }
  120. private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
  121. {
  122. // Set the DrawMode property to draw fixed sized items.
  123. listBox1.DrawMode = DrawMode.OwnerDrawFixed;
  124. // Draw the background of the ListBox control for each item.
  125. e.DrawBackground();
  126. // Define the default color of the brush as black.
  127. Brush myBrush = Brushes.Black;
  128. FontFamily fontFamily = new FontFamily("宋体");
  129. System.Drawing.Font myFont = new Font(fontFamily, 9);
  130. // Determine the color of the brush to draw each item based on the index of the item to draw.
  131. if((e.State & DrawItemState.Selected) == DrawItemState.Selected)
  132. {
  133. //e.Graphics.FillRectangle(Brushes.Blue, e.Bounds);
  134. if(e.Index > -1)
  135. {
  136. e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), myFont, Brushes.White, e.Bounds, StringFormat.GenericDefault);
  137. }
  138. }
  139. else
  140. {
  141. //e.Graphics.FillRectangle(Brushes.White, e.Bounds);
  142. if(e.Index > -1)
  143. {
  144. e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), myFont, myBrush, e.Bounds, StringFormat.GenericDefault);
  145. }
  146. }
  147. // Draw the current item text based on the current Font and the custom brush settings.
  148. //e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
  149. // If the ListBox has focus, draw a focus rectangle around the selected item.
  150. e.DrawFocusRectangle();
  151. }
  152. #endregion

转载来自:http://blog.csdn.net/Rock870210/article/details/5856235

在Winfrom下实现类似百度、Google搜索自能提示功能的更多相关文章

  1. 【搜索引擎】 PostgreSQL 10 实时全文检索和分词、相似搜索、模糊匹配实现类似Google搜索自动提示

    需求分析 要通过PostgreSQL实现类似Google搜索自动提示的功能,例如要实现一个查询海量数据中的商品名字,每次输入就提示用户各种相关搜索选项,例如淘宝.京东等电商查询 思路 这个功能可以用 ...

  2. Jquery实现类似百度的搜索框

    最近工作中需要做一个搜索框,类似百度的搜索框,需要达到两个功能: 1.输入关键字,展示匹配的下拉列表 2.选择匹配的项后查出相关内容 一般电商网站中也经常用到该搜索条,首先分析功能实现,输入关键字马上 ...

  3. ajax+JQuery实现类似百度智能搜索框

    最近再学习ajax,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...

  4. C#winform抓取百度,Google搜索关键词结果

    基于网站seo,做了一采集百度和Google搜索关键字结果的采集.在这里与大家分享一下 先看先效果图 代码附加:  1   private void baidu_Click(object sender ...

  5. Jquery实现搜索框提示功能

    博客的前某一篇文章中http://www.cnblogs.com/hEnius/p/2013-07-01.html写过一个用Ajax来实现一个文本框输入的提示功能.最近在一个管理项目的项目中,使用后发 ...

  6. **IOS自动完成(搜索自动提示)功能实现

    UISearchBar搜索AutoComplete下拉列表搜索提示 http://www.codeios.com/thread-10685-1-1.html 介绍:     在搜索框上加入下拉列表.在 ...

  7. AJAX实现类似百度的搜索提示,自动补全和键盘、鼠标操作

    <script type="text/javascript"> $(document).ready(function(){ var highlightIndex = - ...

  8. 使用jqueryUI和corethink实现的类似百度的搜索提示

    代码:http://download.csdn.net/detail/u012995856/9676845 效果: 目录: 这里是以corethink模块的形式,只需要安装上访问 index.php? ...

  9. vue单页面条件下添加类似浏览器的标签页切换功能

    在用vue开发的时候,单页面应用程序,而又有标签页这种需求,各种方式实现不了, 从这个 到这个,然后再返回上面那个 因为每个标签页的route不一样,导致组件重新渲染的问题,怎么都不知道如何实现... ...

随机推荐

  1. XHTML与HTML的差别

    HTML与XHTML之间的差别,粗略可以分为两大类比较:一个是功能上的差别,另外是书写习惯的差别.关于功能上的差别,主要是XHTML可兼容各大浏览器.手机以及PDA,并且浏览器也能快速正确地编译网页. ...

  2. POP音原因

    一,通话时调节音量,有POP音. POP音产生原因在于,音量变化太大导致有POP音,需要以淡入淡出的方式调节音量.请申请MOLY00108114 & MOLY00108143这两个Modem ...

  3. 把中文版NetBeans改成英文版

    不管你从官网下的是英文版还是中文版,安装之后操作界面都是中文的.这是因为NetBeans会根据你的操作系统自动设置界面语言,并且没有提供更改的功能.解决的方法也很简单,下面介绍我用过的两种方法: 方法 ...

  4. pandas 基础

    pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包 类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据 ...

  5. iOS之Nib和Xib以及storyboard(故事版)

    本文转发至:http://blog.csdn.net/tonny_guan/article/details/8542789 nib.xib与故事板 如果大家使用过苹果的官方资料,一定会发现某些资料上会 ...

  6. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  7. PHP学习笔记-1——快捷键

    整行删除 ctrl+E set get 生成 alt+ insert 查找.搜索和替换 Ctrl-F3 搜索位于插入点的词 F3/Shift-F3 在文件中查找下一个/上一个 Ctrl-F/H 在文件 ...

  8. SpingMvc 注解的使用

    1.使用注解减少配置xml文件 2.注解可以降低耦合度 3.使用注解编写的普通类 import javax.servlet.http.HttpServletRequest; import org.sp ...

  9. VC#2010 视图设计器无法打开 问题的正解

    继上次VC#2010中视图设计器无法打开的问题的讨论后,我感觉每次都重新安装一次安装包未免也太麻烦了,程序员的时间都灰常宝贵. 所以在这次人工智能作业的时候,找到了一个简单的途径: 打开VC#2010 ...

  10. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...