我有问题让我的组合框搜索项目中的字符串。 我想缩小一份成员名单。它们以这种方式格式化(唯一成员ID) - 名字 - 姓氏。
当我“按原样”保留所有设置时,它只会“允许”我搜索字符串中的第一个字符。
DataSource是从列表中设置的,循环遍历文件夹中的所有文件。
我一直使用的代码如下(部分代码)
private void searchForShooterComboBox_KeyUp(object sender, KeyEventArgs e)
{
//if(e => KeyCode == Keys::Down || e => KeyCode == Keys::Down)
//string comboBoxValue = searchForShooterComboBox.Text;
//searchForShooterComboBox.DataSource = null;
//searchForShooterComboBox.DataSource = fliterComboBox(searchForShooterComboBox, memberFileNames);
//searchForShooterComboBox.Text = comboBoxValue;
}
private void searchForShooterComboBox_TextChanged(object sender, EventArgs e)
{
searchForShooterComboBox.DataSource = null;
searchForShooterComboBox.DataSource = fliterComboBox(searchForShooterComboBox, memberFileNames);
}
private List<string> fliterComboBox(ComboBox cobx, List<string> stringList)
{
List<string> returnList = new List<string>();
if (cobx.Text != ""){
try
{
foreach (string s in stringList)
{
if (s.Contains(cobx.Text))
{
returnList.Add(s);
}
}
}catch{
}
}
return returnList;
}
我试过的一些代码似乎过滤了列表OK,但是在方法运行之后它将新列表中的第一项填充到“文本字段”中,因此用户将无法继续键入一个名字ex。
使用ComboBox.Items.Add()
和ComboBox.Items.Remove()
代替使用DataSource
会有什么不同吗?
编辑:comboBox DataSource最初在form_load事件处理程序中设置。关于组合框的以下代码是:
searchForShooterComboBox.DropDownStyle = ComboBoxStyle.DropDown;
searchForShooterComboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
searchForShooterComboBox.AutoCompleteSource = AutoCompleteSource.ListItems
感谢您花时间去看。
答案 0 :(得分:0)
好吧,好像我自己想出了一些东西,不知道它是不是最好的方式,但似乎完成了工作:)
首先,我将字符串添加到ComboBox.items
和list<string>
中。两种方式添加它们的原因是用户可以在加载时查看所有可用选项。
for (int i = 0; i < membersFiles.Length; i++)
{
searchForShooterComboBox.Items.Add(membersFiles[i].Replace(".txt", "").Replace(@"C:\Users\Nicolai\Desktop\skytter\", "").Replace("-", " "));
memberFileNames.Add(membersFiles[i].Replace(".txt", "").Replace(@"C:\Users\Nicolai\Desktop\skytter\", "").Replace("-", " "));
}
之后我从属性窗口添加了一个combobox_keydown事件。
private void searchForShooterComboBox_KeyDown(object sender, KeyEventArgs e)
{
try
{
//checking if the key pressed is RETURN, in that case try to fill the combobox with the selected item,
//and continuing with other method
if (e.KeyValue == 13)
{
searchForShooterComboBox.Text = (string)searchForShooterComboBox.SelectedItem;
fillInfoInForm();
}
//making sure the key pressed IS NOT DOWN, UP, LEFT, RIGHT arrow key.
else if (e.KeyValue > 40 || e.KeyValue < 37)
{
filterComboBox(searchForShooterComboBox, searchForShooterComboBox.Text);
searchForShooterComboBox.Select(searchForShooterComboBox.Text.Length, 0);
searchForShooterComboBox.DroppedDown = true;
}
}
catch (FileNotFoundException ex) {
MessageBox.Show("Der blev ikke fundet nogen fil med flg. sti " + ex.FileName + "\nHusk at vælge hele navnet i listen, eller skriv det nøjagtigt som det står!");
}
}
使用此方法搜索列表项,清除组合框中的项目,并添加匹配项。
private void filterComboBox(ComboBox cobx, string enteredSearch)
{
//clearing ComboBox items before adding the items from the LIST that meets the search
cobx.Items.Clear();
//looping over the items from the list, comparing them to the search from the combobox text field.
//if the item in the list does not contain the string searched it will return an index of -1.
for (int i = memberFileNames.Count-1; i >= 0; i--)
{
if (memberFileNames[i].IndexOf(enteredSearch, 0, StringComparison.CurrentCultureIgnoreCase) >= 0)
{
cobx.Items.Add(memberFileNames[i]);
}
}
}
如果您在找到正确的KeyValues时遇到问题,请尝试查看 https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.keyvalue(v=vs.110).aspx 并从那里复制粘贴代码,并将其添加到key_down事件处理程序,它将在消息框中显示大多数信息(如果不是全部)。
这是我的解决方法,如果你有更好的方法,我很满意:)