关于vb.net中ComboBox的问题 关于设定选区字符串的起始位置
如题:在一个添加窗体中有一个ComboBox控件,控件中已填充有内容。如果其中内容有计算,计算器,计算机。。。等,当我在ComboBox中刚输入一个“计”字时,其下拉框中以“计”开头的词都会优先出现,供我选择。但我不知道在vb.net中改写在ComboBox的什么事件中,应该怎么写?请高手们指点。谢谢!
[解决办法]
private void Form1_Load(object sender, EventArgs e) { this.comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest; this.comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; this.comboBox1.AutoCompleteCustomSource = new AutoCompleteStringCollection(); this.comboBox1.AutoCompleteCustomSource.AddRange(new string[] { "计算机1", "计算机2","sss" }); }
[解决办法]
将ComboBox控件内容村数据库
在
Private Sub ComboBox1_TextUpdate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextUpdate
End Sub
这个方法里执行select语句
例如,ComboBox控件内容表为Combo,字段只有一个就是string
Dim name As String
Private Sub ComboBox1_TextUpdate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextUpdate
name = ComboBox1.Text
Dim sql As String
sql = "select string form combo where string like" & name & "%"
Dim DataReader As System.Data.OleDb.OleDbDataReader'定义DataReader对象
Dim OleDbConnection1 As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim OleDbCommand1 As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand
OleDbConnection1.ConnectionString = "Provider=MSDAORA.1;Data Source=vbora;User ID=xiaos;Password=xiaos" '数据库连接字符串
OleDbConnection1.Open()
OleDbCommand1.Connection = OleDbConnection1
OleDbCommand1.CommandText = sql
DataReader = OleDbCommand1.ExecuteReader
While DataReader.Read()
ComboBox1.Items.Add(DataReader.GetValue(0))
End While
DataReader.Close()
OleDbConnection1.Close()
ComboBox1.DroppedDown = True
End Sub
我sql语句不是很会,可能模糊查找语句写的不对,但是原理就是这样,你可以试试
[解决办法]
自己重新作了下,在click方法下做了限定
Dim name As String
Private Sub ComboBox1_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDown
name = ComboBox1.Text
If name = Nothing Then
If ComboBox1.Items.Count > 0 Then
ComboBox1.Items.Clear()
End If
Dim DataReader As System.Data.OleDb.OleDbDataReader'定义DataReader对象
Dim OleDbConnection1 As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim OleDbCommand1 As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand
OleDbConnection1.ConnectionString = "Provider=MSDAORA.1;Data Source=vbora;User ID=xiaos;Password=xiaos" '数据库连接字符串
OleDbConnection1.Open()
OleDbCommand1.Connection = OleDbConnection1
OleDbCommand1.CommandText = "select string form combo "
DataReader = OleDbCommand1.ExecuteReader
While DataReader.Read()
ComboBox1.Items.Add(DataReader.GetValue(0))
End While
DataReader.Close()
OleDbConnection1.Close()
End If
End Sub
Private Sub ComboBox1_TextUpdate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextUpdate
If ComboBox1.Items.Count > 0 Then
ComboBox1.Items.Clear()
End If
name = ComboBox1.Text
Dim sql As String
If name = Nothing Then
sql = "select string form combo "
Else
sql = "select string form combo where string like" & name & "%"
End If
Dim DataReader As System.Data.OleDb.OleDbDataReader'定义DataReader对象
Dim OleDbConnection1 As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim OleDbCommand1 As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand
OleDbConnection1.ConnectionString = "Provider=MSDAORA.1;Data Source=vbora;User ID=xiaos;Password=xiaos" '数据库连接字符串
OleDbConnection1.Open()
OleDbCommand1.Connection = OleDbConnection1
OleDbCommand1.CommandText = sql
DataReader = OleDbCommand1.ExecuteReader
While DataReader.Read()
ComboBox1.Items.Add(DataReader.GetValue(0))
End While
DataReader.Close()
OleDbConnection1.Close()
ComboBox1.DroppedDown = True
End Sub
[解决办法]
.net 1.x没有这个属性,需要自己写代码
http://borland.mblogger.cn/jinjazz/posts/23144.aspx
using System;using System.Runtime.InteropServices;namespace AutoComplete{ /// <summary> /// ComboboxHelper 的摘要说明。 /// 调用: /// private void Form1_Load(object sender, System.EventArgs e) /// { /// new SetComboboxAuto(this.comboBox1); /// } /// </summary> /// public class COMEnumString :UCOMIEnumString { public string[] StringList; private int currentPosition = 0; public int Next( int celt, string[] rgelt, out int pceltFetched) { pceltFetched = 0; while ((currentPosition <= StringList.Length-1) && (pceltFetched < celt)) { rgelt[pceltFetched] = StringList[currentPosition]; pceltFetched++; currentPosition++; } if (pceltFetched == celt) return 0; // S_OK; else return 1; // S_FALSE; } public int Skip( int numElementToSkip) { currentPosition += numElementToSkip; if (currentPosition <= StringList.Length - 1) return 0; // S_OK; else return 1; // S_FALSE; } public int Reset() { currentPosition = 0; return 0; } public void Clone( out UCOMIEnumString ppenum) { COMEnumString clone = new COMEnumString(); clone.currentPosition = currentPosition; clone.StringList = (String[])StringList.Clone(); ppenum = clone; } } [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("EAC04BC0-3791-11D2-BB95-0060977B464C")] public interface IAutoComplete2 { Int32 Init( IntPtr hwndEdit, [MarshalAs(UnmanagedType.IUnknown)] Object punkACL, [MarshalAs(UnmanagedType.LPWStr)] string pwszRegKeyPath, [MarshalAs(UnmanagedType.LPWStr)] string pwszQuickComplete); [PreserveSig] Int32 Enable( Int32 fEnable); [PreserveSig] Int32 SetOptions( UInt32 dwFlag); [PreserveSig] Int32 GetOptions( out UInt32 pdwFlag); } [Flags] public enum AutoCompleteOptions { None = 0, //没有自动完成 AutoSuggest = 0x1,//启用自动建议的下拉列表框 AutoAppend = 0x2,//启用自动添加 Search = 0x4,//在完成的串中添加搜索项目,选中此项目启动搜索引擎 FilterPreFixes = 0x8,//不匹配逗号前缀,如“www.”,“http://”等 UseTab = 0x10,//使用Tab键从下拉框清单中选择 UpDownKeyDropsList = 0x20,//使用上下箭头键显示自动建议的下拉框清单 RtlReading = 0x40 //常规窗口从左到右显示文本。Windows 可以被映射显示诸如 Hebrew 或 Arabic 这样从右到左阅读的语言。通常,某个控制的文本与其父窗口文本的阅读/显示方向相同。如果设置ACO_RTLREADING,那么文本阅读方向与其父窗口文本阅读方向相反。 } public class AutoComplete : IDisposable { protected IAutoComplete2 m_iAutoComp; public AutoComplete(IntPtr hwndTextBox, string [] DataList) { COMEnumString sourceList = new COMEnumString(); sourceList.StringList = DataList; Type typeAutoComplete = Type.GetTypeFromCLSID(new Guid("{00BB2763-6A77-11D0-A535-00C04FD7D062}")); m_iAutoComp = (IAutoComplete2)Activator.CreateInstance(typeAutoComplete); AutoCompleteOptions ACOptions = AutoCompleteOptions.AutoSuggest; m_iAutoComp.Init(hwndTextBox, sourceList, "", ""); m_iAutoComp.SetOptions((UInt32)ACOptions); m_iAutoComp.Enable(1); } public void Disable() { AutoCompleteOptions ACOptions = AutoCompleteOptions.None; m_iAutoComp.SetOptions((UInt32)ACOptions); } public void Enable() { AutoCompleteOptions ACOptions = AutoCompleteOptions.AutoSuggest |AutoCompleteOptions.AutoAppend |AutoCompleteOptions.UpDownKeyDropsList |AutoCompleteOptions.FilterPreFixes; m_iAutoComp.SetOptions((UInt32)ACOptions); } public void Dispose() { Marshal.ReleaseComObject(m_iAutoComp); } } public class SetComboboxAuto { [DllImport("user32.dll")] public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow); private System.Windows.Forms.ComboBox _combobox=null; private IntPtr hCombobox; public SetComboboxAuto(System.Windows.Forms.ComboBox thisCombo) { this._combobox=thisCombo; this._combobox.DropDownStyle=System.Windows.Forms.ComboBoxStyle.DropDown; this._combobox.Leave+=new System.EventHandler(this.comboboxLeave); hCombobox=FindWindowEx(this._combobox.Handle,new IntPtr(0),"Edit",null); new AutoComplete(hCombobox, this.getListItem(this._combobox)).Enable(); } public string[] getListItem(System.Windows.Forms.ComboBox cbx) { string [] ret=new string[cbx.Items.Count]; for(int i=0;i<cbx.Items.Count;i++) { ret[i]=cbx.Items[i].ToString(); } return ret; } private void comboboxLeave(object sender,System.EventArgs e) { int sel=this._combobox.FindStringExact(this._combobox.Text); if (sel>=0) this._combobox.SelectedIndex=sel; else { if (this._combobox.Text!="") { this._combobox.Text=""; this._combobox.Select(); System.Windows.Forms.MessageBox.Show(";("); } } } }}
[解决办法]
顶楼上的强人!
[解决办法]
在TextChanged事件里面使用,一样的
Dim str As String Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged str = ComboBox1.Text Dim dt() As String = {"计算机", "计算其", "中过", "笨蛋", "排序"} Dim i As Integer Dim mm() As String = {"计算机", "计算其", "中过", "笨蛋", "排序"} Dim x As Integer = 0 Dim y As Integer = 0 For i = 0 To ComboBox1.Items.Count - 1 dt(i) = ComboBox1.Items(i).ToString Next If ComboBox1.Items.Count > 0 Then ComboBox1.Items.Clear() End If If str = Nothing Then Else ComboBox1.Sorted = False For i = 0 To dt.Length - 1 If dt(i).StartsWith(str) Then mm(y) = dt(i) y = y + 1 Else mm(dt.Length - 1 - x) = dt(i) x = x + 1 End If Next For i = 0 To mm.Length - 1 ComboBox1.Items.Add(mm(i)) Next ComboBox1.DroppedDown = True End If End Sub
[解决办法]
所谓的优先显示就是对combobox的内容进行重新排序~~
你在combobox的TextChanged进行有条件的排序操作就好,
我写的数据库操作的做不到优先显示,只是按条件只显示和你输入数字相关的条目
后来combobox的itme重新填充可以做到所有数据全部显示并且优先显示和你输入的相似的数据
多了很多东西是因为你没有在textchanged事件内的最开始对combobox的项进行清空(combobox.Items.Clear())
[解决办法]