我知道这个问题可能会被问过几次,但我环顾四周,找不到适合我的正确方法。 所以,这是我的问题。
我目前有一个列表框,它从mysql数据库中取出“name”列。 应用程序启动后,它会立即加载列表框中的所有名称。 但因为可能有很多名字我想要一个过滤选项。 所以,如果你有列表框中的Mark Jones,Billy Peter,你只需要在文本框中输入Mark,Mark Jones就会出现。
填写列表框初始化组件:
void fill_listbox()
{
string constring = "datasource=localhost;port=3306;username=root;password=xdmemes123";
string Query = "select * from life.players ;";
MySqlConnection conDataBase = new MySqlConnection(constring);
MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase);
MySqlDataReader myReader;
try
{
conDataBase.Open();
myReader = cmdDataBase.ExecuteReader();
while (myReader.Read())
{
string sName = myReader.GetString("name");
namelistbox.Items.Add(sName);
}
}catch (Exception ex)
{
MessageBox.Show("Something went wrong. Error copied to clipboard.");
Clipboard.SetText(ex.Message);
}
}
文本框名为“SrchBox”,列表框名称为“namelistbox”
我尝试了几件事,但它似乎从未奏效。
感谢。
答案 0 :(得分:0)
不是将SQL查询中的名称直接分配给列表框,而是将它们分配给稍后可以过滤的列表或数组:
List<string> playerNames;
void fill_listbox()
{
string constring = "datasource=localhost;port=3306;username=root;password=xdmemes123";
string Query = "select * from life.players ;";
MySqlConnection conDataBase = new MySqlConnection(constring);
MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase);
MySqlDataReader myReader;
try
{
conDataBase.Open();
myReader = cmdDataBase.ExecuteReader();
while (myReader.Read())
{
string sName = myReader.GetString("name");
playerNames.Add(sName);
}
foreach(string name in playerNames)
{
namelistbox.Items.Add(name);
}
}catch (Exception ex)
{
MessageBox.Show("Something went wrong. Error copied to clipboard.");
Clipboard.SetText(ex.Message);
}
}
然后,您可以为TextBox
的{{3}}添加事件处理程序:
void textBox_TextChanged(object sender, EventArgs e)
{
// create filtered list from playerNames
var filteredList = from name in playerNames
where CultureInfo.CurrentCulture.CompareInfo.IndexOf(name, textBox.Text, CompareOptions.IgnoreCase) >= 0
select name;
namelistbox.Items.Clear();
foreach (string name in filteredList)
namelistbox.Items.Add(name);
}