【问题标题】:Making a perfect auto complete TextBox in c#在 C# 中制作一个完美的自动完成文本框
【发布时间】:2020-08-07 03:29:12
【问题描述】:

我已经创建了一个搜索文本框,并在“按名称”文本位于组合框中时启用了自动完成功能。 自动完成源是我的 .mdf 数据库文件。自动完成工作正常,但有一个问题。

当我点击自动完成建议时,建议中的文本会被选中并输入到文本框中,但同时还会输入几个 'Spaces'

所以,下一次,当我点击文本框时,Ibeam 不会从文本的最后一个字母开始,我必须 BackSpace 几次。

我认为我错过了一些自动完成属性。

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

 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_name 的数据类型是什么?如果是 nchar 或 char,那么你肯定会有杂散空间
  • @OrElse 的答案应该可以完美运行,但我强烈建议您更改表格以改用 nvarchar。仅当每个值的长度相同时才使用 nchar。
  • @Martheen 我认为 nchar 和 nvarchar 是一样的。他们不是吗??它们有什么区别?
  • nchar 和 char 不存储您存储到其中的字符串多长时间。结果,当您回读时,您总是会得到带有填充空间的字符串如果原始字符串没有填满整个分配的空间。如果您存储长度永远固定的国家 ID 或货币代码,则可以节省空间(因为它不存储长度)。否则对于具有可变长度的数据,不使用 varchar 或 ncarchar 意味着您正在浪费空间,并且需要不断地修剪各处。另外,这也意味着人们不能在他们真正想要的时候存储尾随空格,因为它会被修剪。

标签: c# autocomplete


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2013-06-15
    • 2018-02-05
    • 2016-04-26
    • 2011-04-18
    • 2010-09-22
    相关资源
    最近更新 更多