我制作了一个可编辑组合框,用于过滤项目。
下面列出了一些问题。
1。)第一个问题是它仅在第一次工作。例如,第一次输入B时,它会显示以B开头的项目列表。然后,如果我按Backspace键并再次输入B,那么它将仅显示列表中以B开头的第一项。这是现在的实际问题。下面是我修改后的代码的链接。
2。)第二个问题是我无法在组合框中键入完整的单词,它使我只能键入第一个字母。它显示了与之匹配的项目的列表。
XAML边码
<ComboBox Height="23" HorizontalAlignment="Left" Margin="292,104,0,0" Name="comboBox3" VerticalAlignment="Top" Width="149" IsEditable="True" IsTextSearchEnabled="True" PreviewTextInput="comboBox3_PreviewTextInput" TextBoxBase.TextChanged="ComboBox_TextChanged"/>
事件处理程序
private void comboBox3_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
ComboBox comboBox = sender as ComboBox;
comboBox.IsDropDownOpen = true;
}
private void ComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (((ComboBox)sender).Text != "")
{
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("Select p_id_pk,p_name FROM products", con);
da.Fill(ds, "products");
comboBox3.ItemsSource = ds.Tables[0].DefaultView.RowFilter = "p_name like '" + ((ComboBox)sender).Text + "'+'%'";
//comboBox3.ItemsSource = ds.Tables[0].DefaultView.RowFilter = "p_name like 'B%'";
comboBox3.ItemsSource = ds.Tables[0].DefaultView;
comboBox3.DisplayMemberPath = ds.Tables[0].Columns["p_name"].ToString();
comboBox3.SelectedValuePath = ds.Tables[0].Columns["p_id_pk"].ToString();
}
}
请帮助
答案 0 :(得分:1)
如果我是您,出于性能原因,我将使用以下方法:
private DataSet ds = null; // initialize dataset with null value
private void ComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (ds == null) // initialize dataset on demand with all possible values from database
{
ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter("Select p_id_pk,p_name FROM products", con);
da.Fill(ds, "products");
comboBox3.ItemsSource = ds.Tables[0].DefaultView;
comboBox3.DisplayMemberPath = ds.Tables[0].Columns["p_name"].ToString();
comboBox3.SelectedValuePath = ds.Tables[0].Columns["p_id_pk"].ToString();
return;
}
// filter view based on text input
ds.Tables[0].DefaultView.RowFilter = "p_name like '"+ comboBox3.Text + "%'";
}
答案 1 :(得分:0)
private void ComboBox_TextChanged(object sender, TextChangedEventArgs e)
{
var searchtext = comboBox3.Text;
comboBox3.ItemsSource = null;
SqlDataAdapter da = new SqlDataAdapter("Select p_id_pk,p_name FROM products where p_name like '" + comboBox3.Text + "'+'%'", con);
DataSet ds = new DataSet();
da.Fill(ds, "products");
comboBox3.ItemsSource = ds.Tables[0].DefaultView;
comboBox3.DisplayMemberPath = ds.Tables[0].Columns["p_name"].ToString();
comboBox3.SelectedValuePath = ds.Tables[0].Columns["p_id_pk"].ToString();
comboBox3.Text = searchtext;
}
答案 2 :(得分:0)
我已经通过在XAML方面进行简单的更改解决了我的问题。现在我问题中的代码可以正常工作,并且WPF Simple组合框已转换为Filtered Combobox。
我已经基本设置
IsTextSearchEnabled="True"
到
IsTextSearchEnabled="False"
这解决了我自1个月左右以来一直面临的问题。
<ComboBox Height="23" HorizontalAlignment="Left" Margin="292,104,0,0" Name="comboBox3" VerticalAlignment="Top" Width="149" IsEditable="True" IsTextSearchEnabled="False" PreviewTextInput="comboBox3_PreviewTextInput" TextBoxBase.TextChanged="ComboBox_TextChanged"/>
感谢所有试图帮助我的人。