加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中选择动态创建的列表框项

发布时间:2020-12-15 21:54:09 所属栏目:百科 来源:网络整理
导读:我动态创建了一个列表框并用一些项填充它.在文本框中键入一个点后,我想显示列表框,以便用户可以使用箭头键选择任何项目. 到目前为止,我做了一切.当用户在文本框中键入一个点时,会显示列表框,但箭头键不会选择任何项目! private void txtResults_KeyDown(obj
我动态创建了一个列表框并用一些项填充它.在文本框中键入一个点后,我想显示列表框,以便用户可以使用箭头键选择任何项目.
到目前为止,我做了一切.当用户在文本框中键入一个点时,会显示列表框,但箭头键不会选择任何项目!

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中,调用ShowListbox()方法.没什么好看的!

注意:

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

解决方法

从文本框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,在第二次命中时它将包含焦点.

最终编辑:

如果列表框需要关注上/下箭头键(并且只使用这些键):

if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
{
       ShowPopUpList();
       listBox1.Focus();
       listBox1.SelectedIndex = 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读