如何在不输入文本的情况下以编程方式显示自动完成

时间:2014-01-04 11:40:09

标签: c# winforms textbox

C#TextBox AutoCompleteCustomSource有一个List<string>AutoCompleteMode = Suggest

我在输入信件时可以看到列表。

如何在不以编程方式键入字母的情况下显示整个列表?这必须在用户按下TextBox中的向下箭头键时完成。

是否有可用的Win32 API?

我的解决方案

我提炼了一个更好的解决方案。

向表单添加ListBox控件并将其设为Visible = false

int curSelIndex = -1;

下面给出的代码将执行Form_Load事件。

txtEmpId.AutoCompleteCustomSource.AddRange(EmpIds.ToArray());
lstAutoComplete.Items.Clear();
lstAutoComplete.Items.AddRange(EmpIds.ToArray());
txtEmpId.KeyDown += (ks, ke) =>
{
    if (!(ke.KeyCode == Keys.Down || 
          ke.KeyCode == Keys.Up || 
          ke.KeyCode == Keys.Enter)) 
    { 
        lstAutoComplete.Visible = false; 
        return; 
    }
    ke.Handled = true;
    if (ke.KeyCode == Keys.Enter)
    {
        if (lstAutoComplete.Visible)
        {
            var str = lstAutoComplete.SelectedItem + "";
            // Process the Selected Item and set to TextBox.
        }
    }
    if (!lstAutoComplete.Visible && txtEmpId.Focused)
    {
        var loc = txtEmpId.Location;
        loc.Y += txtEmpId.Height;
        lstAutoComplete.Location = loc;
        lstAutoComplete.Size = txtEmpId.Size;
        lstAutoComplete.Height = 100;
        lstAutoComplete.SelectedIndex = 0;
        curSelIndex = 0;
        lstAutoComplete.Visible = true;
    }
    else if(lstAutoComplete.Visible && txtEmpId.Focused)
    {
        if (ke.KeyCode == Keys.Down)
        {
            curSelIndex++;
            if (curSelIndex >= lstAutoComplete.Items.Count)
                curSelIndex = lstAutoComplete.Items.Count - 1;
            if (lstAutoComplete.Items.Count > 0)
                lstAutoComplete.SelectedIndex = curSelIndex;
        }
        else if (ke.KeyCode == Keys.Up)
        {
            curSelIndex--;
            if (curSelIndex < 0)
                curSelIndex = 0;
            if (lstAutoComplete.Items.Count > 0)
                lstAutoComplete.SelectedIndex = curSelIndex;
        }
    }
};
txtEmpId.Leave += (ls, le) => lstAutoComplete.Visible = false;

1 个答案:

答案 0 :(得分:3)

我没有为你的问题找到任何API,所以我只是通过使用ListBox来显示我自己的建议框,以显示何时按下向下箭头键,当你进行其他操作时,它会消失。我希望它对你有用。代码示例如下:

//string datasource
List<string> strList = null;
//suggestion listbox
ListBox sugBox = null;

public FrmTextSuggest()
{
    InitializeComponent();
    //setting the textbox control
    strList = new List<string>()
    {
        "USA",
        "England",
        "China",
        "Japan",
        "Korea",
        "India",
        "France",
        "Canada"
    };
    var autoCollection = new AutoCompleteStringCollection();
    autoCollection.AddRange(strList.ToArray());
    this.txtCountry.AutoCompleteCustomSource = autoCollection;
    this.txtCountry.AutoCompleteMode = AutoCompleteMode.Suggest;
    this.txtCountry.AutoCompleteSource = AutoCompleteSource.CustomSource;

    //register the Down Arrow Key event
    this.txtCountry.KeyDown += new KeyEventHandler(txtCountry_KeyDown);
}

void txtCountry_KeyDown(object sender, KeyEventArgs e)
{
    //show the your own suggestion box when pressing down arrow and the text box is empty
    if (e.KeyCode == Keys.Down && txtCountry.Text.Trim().Equals(""))
    {
        sugBox = new ListBox();
        //define the box
        sugBox.Width = txtCountry.Width;
        Point p = txtCountry.Location;
        p.Y += txtCountry.Height;
        sugBox.Location = p;
        sugBox.Items.AddRange(strList.ToArray());
        //copy the value to the textbox when selected index changed.
        sugBox.SelectedIndexChanged += new EventHandler(sugBox_SelectedIndexChanged);
        //show box
        if (sugBox.Items.Count > 0)
        {
            sugBox.SelectedIndex = 0;
            this.Controls.Add(sugBox);
            sugBox.Focus();
        }
    }
    //remove and hide your own suggestion box when other operation
    else
    {
        if (sugBox != null && this.Controls.Contains(sugBox))
        {
            this.Controls.Remove(sugBox);
            sugBox.Dispose();
            sugBox = null;
        }
    }
}

void sugBox_SelectedIndexChanged(object sender, EventArgs e)
{
    string selText = this.sugBox.SelectedItem.ToString();
    if (!string.IsNullOrEmpty(selText))
    {
        this.txtCountry.Text = selText;
    }
}

这是我的测试结果: result picture1

result picture2