2013-07-31 99 views
4

我動態創建了Listbox並填充了一些項目,在Textbox中輸入一個點後,我想顯示Listbox,以便用戶可以使用箭頭鍵選擇任何項目。
到目前爲止,我做了一切。當用戶在Textbox中鍵入一個點時,將顯示Listbox,但箭頭鍵不會選擇任何項目!在C#中選擇動態創建的列表框項目

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創建列表框()在ShowPopUpList(s)ShowListbox()方法被調用的代碼

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

。沒有什麼奇特的!

注:

我只需要在列表框中當我使用向上或向下箭頭鍵來明確選擇一個項目獲得焦點。除非那時我需要能夠自由地繼續打字並且不會失去焦點到列表框。
這是怎麼回事?

+0

您應該可能顯示您用來創建列表框的代碼。 –

+1

我想你初始化和填充ShowPopUpList中的列表框,如果是這樣的話,所有初始化和項目添加將焦點放在那裏,並從文本框keydown處理程序中刪除它。 – terrybozzio

+0

另外檢查列表框的SelectionMode –

回答

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

真正的最大的區別是它得到集中rightaway.with您的舊代碼將首先檢查keydown和第二次擊中它將已經包含焦點。

最後編輯:

如果列表框需要得到集中在上/下箭頭鍵(只有那些鍵):

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

謝謝,這就是它!我想知道爲什麼它沒有在文本框keydown中工作!有什麼不同!? – Breeze

+0

這件事情是可行的,請檢查你的舊代碼(按下下拉鍵不是一個,但2次,你會看到列表框中的選擇),因爲它確實給予「馬上」的焦點,我將編輯其他的解決方案,所以列表框可以立即擁有焦點(在第一個按鍵上),非常簡單。 – terrybozzio

+0

它不再需要,當一個點是類型我不能繼續打字,因爲焦點轉移到列表框,我不得不點擊或輸入失去焦點,並且 開始再次打字。我只需要列表框來獲得焦點,當我使用向上或向下箭頭鍵明確選擇一個項目。 這是怎麼回事? – Breeze

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(); 
     } 
    } 
相關問題