在Windows应用程序中自动完成

时间:2018-05-14 11:25:14

标签: c# windows winforms

如何逐字符地选择文本框中的值,如HDPOS自动填充文本框

我试过了 在页面加载

private void loadproductName()
{
    DataTable dt = _poshelper.getproductName("Bill_Select_ProductName");
    if (dt.Rows.Count != 0)
    {
        string[] postSource = dt
                .AsEnumerable()
                .Select<System.Data.DataRow, String>(x => x.Field<String>("UniqueName"))
                .ToArray();

        var source = new AutoCompleteStringCollection();
        source.AddRange(postSource);
        txtItemName.AutoCompleteCustomSource = source;
    }     
}

暂停

private void txtItemName_Leave(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(txtItemName.Text))
    {
        DataSet ds1 = _poshelper.getproductNameExistWhileLeave(txtItemName.Text);
        if (ds1.Tables[0].Rows.Count == 0)
        {
            txtItemName.Text = "";
            txtItemName.Focus();
        }
        else
        {
            loadLeave(ds1);
            txtItemName.Focus();
        }
    }
}

我需要

如果我使用退格键删除某个字符,则会永久删除

a

我需要像第二张图片,如果我删除意味着我需要保留文本框

b

更新

更多澄清,来自评论

  

如果我按回空格键,则不应删除文本框中的字符串。相反,它应该选择每个字符。每次我按退格键

1 个答案:

答案 0 :(得分:0)

这里我建议进行更改,以使您的文本框具有以下行为。

如果您不希望在文本框中键入退格键时“附加建议”文本(如第一张图片所示)消失,

你可以做这些步骤

  • 获取当前文本框文本(删除最后一个字符,因为我们最后有间隔)
  • 明文的文字
  • 将文本文本发送回文本框

在您的代码中执行以下更改

private void loadproductName()
{
  DataTable dt = _poshelper.getproductName("Bill_Select_ProductName");
  if (dt.Rows.Count != 0)
  {
    string[] postSource = dt
            .AsEnumerable()
            .Select<System.Data.DataRow, String>(x => x.Field<String>("UniqueName"))
            .ToArray();

    var source = new AutoCompleteStringCollection();
    source.AddRange(postSource);
    txtItemName.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
    txtItemName.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;
    txtItemName.AutoCompleteCustomSource = source;
  }
}

我不确定你在Leave事件中做了什么。但您可以添加textBox的{​​{1}}事件,并在该事件中添加如下代码。

KeyUp