C# 在C中选择动态创建的listboxs项

C# 在C中选择动态创建的listboxs项,c#,winforms,C#,Winforms,我动态创建了一个列表框,并在其中填充了一些项目,在文本框中键入一个点后,我希望显示列表框,以便用户可以使用箭头键选择任何项目。 到目前为止,我做了一切。当用户在文本框中键入一个点时,将显示列表框,但箭头键不会选择任何项目 private void txtResults_KeyDown(object sender, KeyEventArgs e) { string[] words= ((TextBox)sender).Text.Split(' '); strin

我动态创建了一个列表框,并在其中填充了一些项目,在文本框中键入一个点后,我希望显示列表框,以便用户可以使用箭头键选择任何项目。 到目前为止,我做了一切。当用户在文本框中键入一个点时,将显示列表框,但箭头键不会选择任何项目

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("الهی شکرت ");
}

在ShowPopUpplists中,调用ShowListbox方法。没什么了不起的

注:

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

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

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

这对我来说非常有效:

    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();
        }
    }

您可能应该显示用于创建ListBox的代码。我想您应该在ShowPopUpList中初始化并填充ListBox,如果是这样,在所有初始化和添加的项目之后,将焦点放在那里,并将其从textbox按键处理程序中移除。还可以选中ListBox的SelectionMode谢谢!我想知道为什么它在文本框按键下不起作用!有什么区别!?问题是它会工作,请用你的旧代码检查它,按下向下键不是一次而是两次,你会看到列表框上的选择,因为它不会立即提供焦点,我将使用其他解决方案进行编辑,这样列表框可以在第一个键按下时立即获得焦点,这非常简单。不再需要它,当点是类型时,我无法继续键入,因为焦点已转移到列表框,我必须单击或输入以丢失焦点并重新开始键入。当我使用向上或向下箭头键显式选择项目时,我只需要列表框来获得焦点。怎么做呢?好的,hossein new edit,我的第一个答案是因为你告诉我当用户键入点时需要列表框来获得焦点,它做到了,现在随着最终编辑,它将接收焦点并选择向上/向下箭头键。谢谢,没有解决我的问题,我想最好以另一个问题的形式问它。
    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();
        }
    }