本文介绍了如何在不输入文本的情况下以编程方式显示自动完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C# 文本框AutoCompleteCustomSource 有一个 ListAutoCompleteMode = Suggest.

C# TextBoxAutoCompleteCustomSource has a List<string>,AutoCompleteMode = Suggest.

我可以在输入字母时看到列表.

I can see the List when I type a Letter.

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

How to show entire list without Typing a Letter Programmatically? This must be done while the User presses the Down Arrow Key in the TextBox.

是否有可用的 Win32 API?

Is there any Win32 API Available?

我改进了一个更好的解决方案.

I refined a Better Solution.

在表单中添加一个 ListBox 控件并将其设为 Visible = false

Add a ListBox Control to the form and make it as Visible = false

int curSelIndex = -1;

下面给定的代码将被执行 Form_Load 事件.

The below given Code will be executed Form_Load Event.

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;

推荐答案

我没有找到解决您问题的 API,所以我只是使用 ListBox 制作了一个我自己的建议框来显示何时向下箭头键被按下,当您进行其他操作时,它会消失.我希望它对你有用.代码示例如下:

I didn't find any API for your problem, so I just make a my own suggestion box by using ListBox to show when the Down Arrow Key is pressed, when you do other operation, it disappeares. I hope it is useful to you. code sample is bellow:

//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;
    }
}

这是我的测试结果:

这篇关于如何在不输入文本的情况下以编程方式显示自动完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 18:05