4

我动态创建了一个Listbox并用一些项目填充它,在Textbox我想要显示的中键入一个点后Listbox,用户可以使用箭头键选择任何项目。
到目前为止,我所做的一切。当用户在 中键入一个点时TextboxListbox会显示,但箭头键不会选择任何项目!

private void txtResults_KeyDown(object sender, KeyEventArgs e)
    {
       string[] words= ((TextBox)sender).Text.Split(' ');
       string s = sampleWord.Text = words[words.Length - 1];

        if (e.KeyCode == Keys.OemPeriod)
        {
            ShowPopUpList(s);
        }
        else if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
        {
            lst.Focus();//doesnt work :-/
        }
        else
        {
            lst.Hide();
            txtResults.Focus();
        }
    }

这是在 FormLoad() 上创建列表框的代码

private void CreateListBox()
{

    lst = new ListBox();
    lst.Size = new Size(70, 130);
    lst.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
    lst.KeyDown += lst_KeyDown;                   
    lst.DoubleClick += lst_DoubleClick;    

    //adding some test input
    lst.Items.Add("بسم");
    lst.Items.Add("الله ");
    lst.Items.Add("الرحمن ");
    lst.Items.Add("الرحیم ");
    lst.Items.Add("بنام ");
    lst.Items.Add("خداوند ");
    lst.Items.Add("بخشنده ");
    lst.Items.Add("مهربان ");
    lst.Items.Add("الهی شکرت ");

}

private void ShowListbox()
{

     txtResults.SelectionStart = txtResults.Text.Length;
     txtResults.SelectionLength = 0;
     Point index = txtResults.GetPositionFromCharIndex(txtResults.SelectionStart-1);
     lst.Location = new Point (index.X-50, index.Y+70);
     this.Controls.Add(lst);
     lst.BringToFront();
     lst.Show();
 }

在方法ShowPopUpList(s)ShowListbox()被调用。没什么好看的!

笔记:

当我使用向上或向下箭头键显式选择一个项目时,我只需要列表框来获得焦点。除非那时我需要能够自由地继续打字并且不要失去对列表框的关注。
这样做的方法是什么?

4

2 回答 2

1

从文本框 keydown 处理程序中删除焦点并将其放置在此处:

        private void ShowPopUpList(string s)
        {
            //your initialization of the
            //listbox  here and after..
            listBox1.Focus();
        }

另一种方式:

if (e.KeyCode == Keys.OemPeriod)
{
     ShowPopUpList(s);
     listBox1.Focus();
}

真正的大区别在于它立即获得焦点。您的旧代码将首先检查 keydown,然后在第二次点击时它已经包含焦点。

最终编辑:

如果 Listbox 需要将焦点放在上/下箭头键上(并且仅使用这些键):

if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
{
       ShowPopUpList();
       listBox1.Focus();
       listBox1.SelectedIndex = 0;
}
于 2013-07-31T13:58:29.333 回答
0

这对我来说效果很好而且花花公子:)

    ListBox lb;

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Contains("."))
        {
            lb = new ListBox();
            lb.Location = textBox1.Location;
            this.Controls.Add(lb);
            lb.Items.Add("Item 1");
            lb.Items.Add("Item 2");
            lb.Items.Add("Item 3");
            lb.Show();
        }
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Down)
        {
            lb.Focus();
        }
    }
于 2013-07-31T14:01:10.470 回答