Combobox中如何自动匹配输入字母或者文字?
combobox的数据集已经得到。
现在要实现输入字母,若combobox下拉条目中有与其相匹配的条目,则下拉条目只显示匹配的汉字集合,如果什么也不输入,则数据集的内容全部显示。
1.
这个如何实现?
2.
另外这个输入在combobox的哪个事件里面写代码呢?
[解决办法]
如果是vs2005,可以用AutoComplete相关属性实现(不过对中文支持有问题)
如果是vs2003,以DataView作为ComboBox的数据源
Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
Me.ComboBox1.DataSource.RowFilter=Me.ComboBox.DisplayMember & " like ' " & Me.ComboBox.Text & "% ' "
If Me.ComboBox1.Focused = True and Me.ComboBox1.DataSource.Count> 0 Then
Me.ComboBox1.DroppedDown = True
Else
Me.ComboBox1.DroppedDown = Flase
End If
End Sub
[解决办法]
取拼音的有专门的方法,查找倒不难
[解决办法]
利用中文字符串按汉字内码比较大小的原理
Dim zh_Tab As Hashtable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
zh_Tab = New Hashtable
zh_Tab.Add( "A1 ", Chr(-20319))
zh_Tab.Add( "B1 ", Chr(-20283))
zh_Tab.Add( "C1 ", Chr(-19775))
zh_Tab.Add( "D1 ", Chr(-19218))
zh_Tab.Add( "E1 ", Chr(-18710))
zh_Tab.Add( "F1 ", Chr(-18526))
zh_Tab.Add( "G1 ", Chr(-18239))
zh_Tab.Add( "H1 ", Chr(-17922))
zh_Tab.Add( "J1 ", Chr(-17417))
zh_Tab.Add( "K1 ", Chr(-16474))
zh_Tab.Add( "L1 ", Chr(-16212))
zh_Tab.Add( "M1 ", Chr(-15640))
zh_Tab.Add( "N1 ", Chr(-15165))
zh_Tab.Add( "O1 ", Chr(-14922))
zh_Tab.Add( "P1 ", Chr(-14914))
zh_Tab.Add( "Q1 ", Chr(-14630))
zh_Tab.Add( "R1 ", Chr(-14149))
zh_Tab.Add( "S1 ", Chr(-14090))
zh_Tab.Add( "T1 ", Chr(-13318))
zh_Tab.Add( "W1 ", Chr(-12838))
zh_Tab.Add( "X1 ", Chr(-12556))
zh_Tab.Add( "Y1 ", Chr(-11847))
zh_Tab.Add( "Z1 ", Chr(-11055))
zh_Tab.Add( "A2 ", Chr(-20284))
zh_Tab.Add( "B2 ", Chr(-19776))
zh_Tab.Add( "C2 ", Chr(-19219))
zh_Tab.Add( "D2 ", Chr(-18711))
zh_Tab.Add( "E2 ", Chr(-18527))
zh_Tab.Add( "F2 ", Chr(-18240))
zh_Tab.Add( "G2 ", Chr(-17923))
zh_Tab.Add( "H2 ", Chr(-17418))
zh_Tab.Add( "J2 ", Chr(-16475))
zh_Tab.Add( "K2 ", Chr(-16213))
zh_Tab.Add( "L2 ", Chr(-15641))
zh_Tab.Add( "M2 ", Chr(-15166))
zh_Tab.Add( "N2 ", Chr(-14923))
zh_Tab.Add( "O2 ", Chr(-14915))
zh_Tab.Add( "P2 ", Chr(-14631))
zh_Tab.Add( "Q2 ", Chr(-14150))
zh_Tab.Add( "R2 ", Chr(-14091))
zh_Tab.Add( "S2 ", Chr(-13319))
zh_Tab.Add( "T2 ", Chr(-12839))
zh_Tab.Add( "W2 ", Chr(-12557))
zh_Tab.Add( "X2 ", Chr(-11848))
zh_Tab.Add( "Y2 ", Chr(-11056))
zh_Tab.Add( "Z2 ", "繇 "c)
Me.DataGrid1.DataSource = DataSet_PName1.Tables( "KuCun_table ").DefaultView
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim str As String = Me.TextBox1.Text
If str = " " Then
Me.DataGrid1.DataSource.RowFilter = " "
Else
Dim chars As Char() = str.ToUpper.ToCharArray
Dim zhstr_start As String
Dim zhstr_end As String
Dim filter As String
For i As Integer = 0 To chars.Length - 1
filter &= "substring(ProjectName, " & i + 1 & ",1) > = ' " & zh_Tab(chars(i) & 1) & " ' and substring(ProjectName, " & i + 1 & ",1) <= ' " & zh_Tab(chars(i) & 2) & " ' " & Chr(13)
Next
filter = filter.Substring(0, filter.Length - 1)
filter = filter.Replace(Chr(13), " and ")
Me.DataGrid1.DataSource.RowFilter = filter
End If
End Sub
[解决办法]
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim str As String = Me.TextBox1.Text
If str = " " Then
Me.DataGrid1.DataSource.RowFilter = " "
Else
Dim chars As Char() = str.ToUpper.ToCharArray
Dim zhstr_start As String
Dim zhstr_end As String
Dim filter As String
For i As Integer = 0 To chars.Length - 1
filter &= "substring(产品名称, " & i + 1 & ",1) > = ' " & zh_Tab(chars(i) & 1) & " ' and substring(产品名称, " & i + 1 & ",1) <= ' " & zh_Tab(chars(i) & 2) & " ' " & Chr(13)
Next
filter = filter.Substring(0, filter.Length - 1)
filter = filter.Replace(Chr(13), " and ")
Me.DataGrid1.DataSource.RowFilter = filter
End If
End Sub
[解决办法]
Private Sub ComboBox1_TextChanged1(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
If Me.ComboBox1.Focused Then
RemoveHandler ComboBox1.TextChanged, AddressOf ComboBox1_TextChanged1
Dim str As String = Me.ComboBox1.Text
If str = " " Then
Me.DataGrid1.DataSource.RowFilter = " "
Else
Dim chars As Char() = str.ToUpper.ToCharArray
Dim zhstr_start As String
Dim zhstr_end As String
Dim filter As String
For i As Integer = 0 To chars.Length - 1
filter &= "substring(产品名称, " & i + 1 & ",1) > = ' " & zh_Tab(chars(i) & 1) & " ' and substring(产品名称, " & i + 1 & ",1) <= ' " & zh_Tab(chars(i) & 2) & " ' " & Chr(13)
Next
filter = filter.Substring(0, filter.Length - 1)
filter = filter.Replace(Chr(13), " and ")
Me.ComboBox1.DataSource.RowFilter = filter
If CType(Me.ComboBox1.DataSource, DataView).Count > 0 Then
Me.ComboBox1.DroppedDown = True
Else
Me.ComboBox1.DroppedDown = False
End If
End If
Me.ComboBox1.SelectedIndex = -1
Me.ComboBox1.Text = str
Me.ComboBox1.SelectionStart = str.Length
AddHandler ComboBox1.TextChanged, AddressOf ComboBox1_TextChanged1
End If
End Sub
[解决办法]
以前做过一个模糊匹配,不过是用textbox+listbox伪造了一个combobox,根据输入的内容过滤listbox同时调整listbox高度,不过那时候listbox内容不是很多,从数据库里取到的条目大概2000+的样子,执行效率还算不错
[解决办法]
RowFilter是什么呢?
这个我帮你查书了
你问的 问题我都 看不懂
就这个 能看懂
这个和dataview有关的
我就给你写个它的基本格式把
dim dataview名 as new dataview(
数据集名.tables( "表名 ",
[筛选条件 rowfilter,
排序条件 sort,
数据行的版本
....
])
例如
dim mydv as new dataview(
dbset.tables( "员工表 "),
"所属部门=‘销售部’ ",
“年龄”
dataviewrowstate.currentrows)