2012-08-09 239 views
0

免責聲明 - 我一直只使用C#大約一週,所以希望這不是一個n00b問題。我確實環顧四周,但無法找到有效的解決方案,其中包括this線程的結果。ComboBox.Text =空字符串,而不是實際顯示的字符串

我在Windows窗體上有一個組合框。組合框的數據從Access數據庫填充。 相關的屬性,我已經設置 - AutoCompleteMode = Append; AutoCompleteSource = ListItems; DropDownStyle = DropDown。用戶必須能夠輸入組合框並自動完成,因此DropDownList的DropDownStyle將不起作用。而不是使用默認的下拉箭頭,我有一個動態的PictureBox取代它。單擊PictureBox或觸發Enter事件將把組合框的DropDown屬性設置爲true。

因爲它目前是,用戶可以選擇的項目就好了或類型的項目,按項目中進入或類型並離開現場,等....在所有這些不同類型的互動,我能夠確定的是什麼組合框中的正確值是。我有一些觸發器來確保SelectedValue和顯示的文本始終保持同步。

我能夠得到正確的值每一個可能的相互作用下,我能想到的,除了一個。如果用戶開始輸入字符串(使用DropDowned屬性= true),並點擊右箭頭鍵使字符串自動完成,則組合框中的字符串始終爲空字符串。

視覺:

Selected_ 文本

在上面的字符串加粗的文字是在組合框中突出顯示的文本。然後,如果用戶點擊右箭頭鍵,使在組合框中的文字看起來像

Selected_Text

(注意DropDowned仍然是正確的在這一點上)的ComboBox.Text值始終爲「」。

下面是組合框DropDownClosed事件,這是一旦用戶按下輸入被觸發的第一件事情之一的代碼。

private void cmbxYear_DropDownClosed(object sender, EventArgs e) 
    { 
     try 
     { 
      if (!cmbxYear.Text.Equals(cmbxYear.SelectedValue.ToString())) 
      { 
       if (!bUpdated & !bErrorFound) 
       { 
        validateData(cmbxYear, clrYear, false, imgFilter1, imgNoFilter1); 
        updateTable(); 
       } 
      } 
      imgFilter1.Visible = false; 
      imgNoFilter1.Visible = true; 
     } 
     catch 
     { 
      imgNoFilter1.Visible = false; 
      imgFilter1.Visible = true; 
     } 
    } 

我也是剛發現ComboBox.Text總是當DropDowned屬性= true,並且用戶鍵入的東西,然後按「Enter」鍵一個空字符串。如果DropDown屬性= false,則不是這種情況。當發生這種情況時,返回正確的字符串。

我甚至嘗試讓程序選擇組合框中的所有文本;然而,給SelectionLength的值大於ComboBox.Text.Length似乎不起作用。我也嘗試過提及SelectedValue;但是,SelectedValue爲null。

對於所有密集的目的,應用程序時深信,在組合框爲空字符串。

如何檢索實際的字符串?


萬一這有助於我對以下事件的代碼:點擊,DataSourceChanged,下拉列表,DropDownClosed,回車,的KeyDown,Leave和驗證。

+0

你可以顯示一些代碼..?你似乎已經寫了很多東西來解釋看似簡單的解決方案 – MethodMan 2012-08-09 16:41:56

+0

在哪個事件中你將檢索SelectedText? SelectedText尚未填充完全可能(因爲DropDown爲true)。也許在下拉動作完成之前控件不會建立這個值? – 2012-08-09 16:48:23

+0

我一直試圖檢索DropDownClosed事件中的文本(只是爲它添加了代碼) – TehTechGuy 2012-08-09 16:54:03

回答

0

我能夠爲這個明顯的錯誤創建一個成功的解決方法。以下是我的解決方法;希望這個代碼能夠幫助其他人。注意:您可能需要添加其他事件處理程序來微調所有ComoBox的用戶交互,但這將適用於我在問題中描述的問題。

要使用此代碼,您需要在窗體上名爲cmbxTest的組合框。您還需要添加適當的事件處理程序。假設您的表單名稱是frmMain,請在fmrMain.Designer.cs文件中添加此代碼(注意您還需要其他項目,但這些是新的項目,需要將其添加到ComboBox,cmbxTest ,這應該已經在您的測試形式,frmMain)上:

this.cmbxTest.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append; 
this.cmbxTest.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; 
this.cmbxTest.DropDownClosed += new System.EventHandler(this.cmbxTest_DropDownClosed); 
this.cmbxTest.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ComboBoxKeyUp); 
this.cmbxTest.Text = "Test"; // Used in the below example - The default displayed text 

在類文件的形式(在這個例子中frmMain.cs),使它看起來像下面這樣:

public partial class frmMain : Form 
{ 
    // Intial Declerations and initializations 
    Boolean bReady = false;  // Secondary trigger for DataGridView selection 
    string clrTest = "Test";  // Default display text - Clear filter text; Used to ignore the setting if this text is visible 
    string currentText;   // Comboboxes' currently displayed text 

    // Form execution 
    public frmMain() 
    { 
     InitializeComponent(); 
    } 

    // Some code... 

    // 
    // ComboBoxes on KeyPress event 
    //  - Used as a workaround for MS ComboBoxes not updating their text correctly 
    //  - Shared across all ComboBoxes (as applied by the individual controls' event handlers) 
    // 
    private void ComboBoxKeyUp(object sender, KeyEventArgs e) 
    { 
     ComboBox cmb = (ComboBox)sender; 
     currentText = cmb.Text; 
    } 

    // Any trigger you want that requires the ComboBoxes text 
    private void cmbxTest_DropDownClosed(object sender, EventArgs e) 
    { 
     if (!cmbxTest.Text.Equals(clrTest)) 
     { 
      cmbxTest.Text = currentText; 
     } 
     // Do any other code that requires the cmbxTest.Text 
     Console.WriteLine(cmbxTest.Text); 
    } 
} 
1

這可能是一個錯誤:Wrong SelectedItem in DropDownClosed event handler of ComboBox when pressing Tab to leave an opened dropdown

我知道這不等同於您的情況。檢查變通辦法選項卡,查看在那裏發佈的代碼是否可以幫助您。這可能只是使用正確事件的問題。

我對事件訂單和某些Windows窗體控件的選定屬性的體驗一直不太理想。

+0

This wasn我並沒有遇到確切的錯誤,但它很接近。我不認爲他們的解決方法可行,但我正在自己的工作。我會回來一次/如果我有一些工作。 – TehTechGuy 2012-08-09 18:10:43

相關問題