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()それについて空想は何もありません!

ノート:

UP または DOWN 矢印キーを使用して項目を明示的に選択する場合にのみ、リスト ボックスにフォーカスが必要です。そうでない限り、自由に入力を続け、リストボックスへのフォーカスを失わないようにする必要があります。
それを回避する方法は何ですか?

4

2 に答える 2

1

テキストボックスのキーダウン ハンドラーからフォーカスを外し、次の場所に配置します。

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

別の方法:

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

本当の大きな違いは、すぐにフォーカスを取得することです。古いコードでは、最初にキーダウンをチェックし、2 回目のヒットで既にフォーカスが含まれています。

最終編集:

Listbox が上/下矢印キー (およびそれらのキーのみ) にフォーカスする必要がある場合:

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