读书人

关于vb.net中ComboBox的有关问题 关于

发布时间: 2011-12-26 23:09:58 作者: rapoo

关于vb.net中ComboBox的问题 关于设定选区字符串的起始位置
如题:在一个添加窗体中有一个ComboBox控件,控件中已填充有内容。如果其中内容有计算,计算器,计算机。。。等,当我在ComboBox中刚输入一个“计”字时,其下拉框中以“计”开头的词都会优先出现,供我选择。但我不知道在vb.net中改写在ComboBox的什么事件中,应该怎么写?请高手们指点。谢谢!

[解决办法]

C# code
 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

C# code
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事件里面使用,一样的

VB.NET code
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())



[解决办法]
探讨
在TextChanged事件里面使用,一样的


VB.NET codeDim 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 = {"计算机", "计算其", "中过", "笨蛋", "排序…

读书人网 >VB Dotnet

热点推荐