C# 用c语言制作一个完美的自动完成文本框#

C# 用c语言制作一个完美的自动完成文本框#,c#,autocomplete,C#,Autocomplete,我制作了一个搜索文本框,并在组合框中显示“按名称”文本时启用了自动完成。 自动完成源是my.mdf数据库文件。自动完成工作正常,但有一个问题 当我点击“自动完成”建议时,建议中的文本被选中并在文本框中键入,但与文本一起键入的还有几个“空格” 因此,下一次,当我单击文本框时,Ibeam不会从文本的最后一个字母开始,我必须退格几次 我想我错过了一些自动完成属性 这是我的代码,可以与自动完成相关: private void vieworder_Load(object sender, EventA

我制作了一个搜索文本框,并在组合框中显示“按名称”文本时启用了自动完成。 自动完成源是my.mdf数据库文件。自动完成工作正常,但有一个问题

当我点击“自动完成”建议时,建议中的文本被选中并在文本框中键入,但与文本一起键入的还有几个“空格”

因此,下一次,当我单击文本框时,Ibeam不会从文本的最后一个字母开始,我必须退格几次

我想我错过了一些自动完成属性

这是我的代码,可以与自动完成相关:

 private void vieworder_Load(object sender, EventArgs e)
    {
//I am including the load method because I think that problem may be caused because I didn't call the autocomp method here
        try
        {
            con.Open();
            if (con.State == ConnectionState.Open)
            {
                lblstatus.Text = "Connected";
                lblstatus.ForeColor = Color.Green;
            }
            else
            {
                lblstatus.Text = "Not-Connected";
                lblstatus.ForeColor = Color.Red;
            }

            showdtgrid();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
public void showautocomp()
    {
//this is the method that starts the autocomplete

        cmd = new SqlCommand("SELECT cust_name FROM ordertbl ", con);
        SqlDataReader dr = cmd.ExecuteReader();
        AutoCompleteStringCollection autoComplete = new AutoCompleteStringCollection();
        while (dr.Read())
        {
            autoComplete.Add(dr.GetString(0));
        }
        txtsrchbyname.AutoCompleteMode = AutoCompleteMode.Suggest;
        txtsrchbyname.AutoCompleteSource = AutoCompleteSource.CustomSource;
        txtsrchbyname.AutoCompleteCustomSource = autoComplete;
        dr.Close();
    }




 private void btnrefresh_Click(object sender, EventArgs e)
        {
 //the refresh button refreshes the datagrid and auto complete
            showdtgrid();
            showautocomp();
        }

private void search()
        {
//this method selects from DB when button is clicked
            if (cmbsearchby.Text == "By name")
            {
                SqlCommand cmd1 = new SqlCommand("SELECT*FROM ordertbl WHERE cust_name LIKE '" + txtsrchbyname.Text + "%'", con);
                da = new SqlDataAdapter(cmd1);
                dtbl = new DataTable();
                da.Fill(dtbl);
                dtgridViewOrder.DataSource = dtbl;
            }
            else if (cmbsearchby.Text == "Containing")
            {
                SqlCommand cmd2 = new SqlCommand("SELECT*FROM ordertbl WHERE cust_name LIKE '%" + txtsrchbyname.Text + "%'", con);
                da = new SqlDataAdapter(cmd2);
                DataTable dtbl2 = new DataTable();
                da.Fill(dtbl2);
                dtgridViewOrder.DataSource = dtbl2;
            }

        }

 private void txtsrchbyname_Click(object sender, EventArgs e)
        {
//I also included show autocomp method in the text box so I dont have to refresh everytime
            if (cmbsearchby.Text == "By name")
            {
                showautocomp();
            }
            else
            {
                txtsrchbyname.AutoCompleteMode = AutoCompleteMode.None;
            }
        }

问题似乎来自数据库类型
cust\u name
。 一个快速的解决方法是修剪从数据库获取的结果

autoComplete.Add(dr.GetString(0).Trim());

客户名称的数据类型是什么?如果是nchar或char,那么您肯定会有一些错误的空格@OrElse的答案应该可以很好地使用,尽管我强烈建议您将表改为使用nvarchar。只有在每个值的长度相同时才使用nchar。@Martheen我认为nchar和nvarchar是相同的。不是吗??它们之间的区别是什么?nchar和char不存储存储到其中的字符串的长度。因此,当您读回时,如果原始字符串没有填满整个分配的空间,您将始终得到带有填充空间的字符串。例如,如果将国家ID或货币代码存储在长度永久固定的位置,则可以节省空间(因为它不存储长度)。否则,对于长度可变的数据,不使用varchar或ncarchar意味着您正在浪费空间,并且需要不断地修剪所有位置。另外,这也意味着当人们真的想存储尾随空间时,就不能存储尾随空间,因为它会被修剪。