【问题标题】:Editable combobox not working properly可编辑组合框无法正常工作
【发布时间】:2018-08-24 17:33:42
【问题描述】:

我制作了一个可编辑的组合框,用于过滤项目。

下面列出了一些问题。

1.) 第一个问题是它只能在第一次使用。例如,如果我第一次输入 B,它会显示以 B 开头的项目列表。然后如果我按 Backspace 并再次输入 B,那么它只会显示列表中以 B 开头的第一个项目。这是现在的实际问题.下面是我修改后的代码的链接。

2.) 第二个问题是我无法在 Combobox 中输入完整的单词,它只允许我输入第一个字母。它会向我显示与之匹配的项目列表。

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();
        }
    }

请帮忙

【问题讨论】:

    标签: c# .net wpf combobox


    【解决方案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 + "%'";
    }
    

    【讨论】:

    • 这不是我的问题的答案。
    • 您的解决方案给出错误“值不能为空。参数名称:dataSet”
    • @yaseenenterprises 你试过了吗?您需要在构造函数中初始化 ds。
    • 由于自调用循环,您的原始代码无法正常工作。
    【解决方案2】:
    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;  
    }
    

    【讨论】:

      【解决方案3】:

      我通过在 XAML 方面做一个简单的改变解决了我的问题。现在我的问题中的代码可以正常工作,并且 WPF 简单组合框已转换为过滤组合框。

      我已经基本设置好了

            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"/>
      

      感谢所有试图帮助我的人。

      【讨论】:

        猜你喜欢
        • 2015-09-18
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2014-12-13
        • 1970-01-01
        相关资源
        最近更新 更多