2013-01-03 42 views
0

我已閱讀了關於此主題的一堆話題。我嘗試了很多變化,但出於某種原因,我無法讓這個工作。這是問題:我有一個組合框,用Excel工作簿中的工作表名稱填充。 (如果問題存在,我會包含該代碼)當我嘗試獲取選定的文本值時,我什麼也得不到。我究竟做錯了什麼?從組合框中獲取選定的值C#

/******************************************************************************** 
    * The following code takes in an excel filename and populates a combobox based 
    * on the excel tab names. 
    ********************************************************************************/ 
    private void GetExcelSheetNames(string excelFile) 
    { 
     _Application xlApp; 
     Workbook xlTemplateWB; 

     xlApp = new ApplicationClass(); 

     xlTemplateWB = xlApp.Workbooks.Open(Elmnt.getDBPath() + TEMPLATENAME, 0, true, 
      5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); 

     foreach (Worksheet temp in xlTemplateWB.Worksheets) 
     { 
      cboBenchSheets.Items.Add(temp.Name); 
     } 

     xlTemplateWB.Close(true, Missing.Value, Missing.Value); 
     xlApp.Quit(); 
    } 

    /******************************************************************************** 
    * This returns the selected item in the cboBenchSheets combo box 
    ********************************************************************************/ 
    public String getSelection() 
    { 
     String selected; 
     selected = cboBenchSheets.Text;           //Returns nothing 
     selected = cboBenchSheets.SelectedText;         //Returns nothing 
     selected = cboBenchSheets.SelectedValue.ToString();      //Returns nothing 
     selected = cboBenchSheets.GetItemText(cboBenchSheets.SelectedIndex); //Returns -1 

     return selected; 
    } 
+1

這不能回答你的問題,但如果你這樣評論你的代碼,你應該停下來。用'///'註釋你的代碼並使用'

'節點來放置你的註釋 – Eonasdan

+0

當你調試時,你分配給'selected'的任何語句是否都有值?每次分配時都覆蓋變量的值 - 這樣做的目的是什麼?它只是測試,看看哪個屬性包含?逐步進行調試會更容易。 – Bridge

+0

請提供我們的代碼來填充您的cboBenchSheets_。此外,您是否可以在您的答案中包含**致getSelection()**,請僅 –

回答

2

我覺得documentation for ComboBox的這一部分可能會有所幫助:

可以使用SelectedText屬性檢索或更改ComboBox控件的 當前選定的文本。但是,您應該知道,由於用戶 交互,選擇可以自動更改。例如,如果您在 按鈕Click事件處理程序中檢索SelectedText值,則該值將爲空字符串。這是 ,因爲當輸入焦點 從組合框移動到按鈕時,選擇會自動清除。

當組合框失去焦點時,選擇點將移動到文本的開頭 ,並且任何選定的文本都將變爲未選中狀態。在 這種情況下,獲取SelectedText屬性將檢索一個空的 字符串,並設置SelectedText屬性將指定值 添加到文本的開頭。

當組合框獲得焦點時,控件中的全文將自動選中 。如果您調用控件的Focus方法來設置 輸入焦點,則無論 控件是否已獲得焦點,都會選擇全文。當用戶從 下拉列表中選擇一個項目或使用向上箭頭和向下箭頭鍵時,將自動選擇新項目的文本 。但是,如果您嘗試在SelectedIndexChanged或 SelectedValueChanged事件處理函數中獲取SelectedText值 ,則該屬性將返回一個空的 字符串。這是因爲,在發生這些事件時,之前的 SelectedText值已被清除,並且新值尚未設置爲 。要檢索SelectedIndexChanged或SelectedValueChanged事件處理函數中的當前值,請改爲使用SelectedItem屬性 。

+0

知道當組合框失去焦點時,選擇點移動到開頭是很好的。但是,這仍然不能告訴我如何檢索選定的文本。我只是嘗試添加cboBenchSheets_SelectedIndexChanged()與cboBenchSheets.Focus();並選擇= cboBenchSheets.SelectedValue.ToString();那也沒用。我究竟做錯了什麼? –

+0

我懷疑你沒有選擇一個項目,這就是爲什麼所有返回一個選定項目的嘗試都沒有返回。 'selected = cboBenchSheets.Items [1] .ToString()'返回任何東西嗎?這應該有助於縮小問題的範圍 – FakeDIY

+0

我得到一個ArgumentOutOfRangeException。那是什麼意思? –

1

如果您使用項目填充組合框並且不使用任何其他項目,那麼在用戶或代碼中明確設置所選項目之前,它沒有選定項目。我知道這看起來很奇怪,因爲組合框似乎默認選擇第一個項目,但這只是它的方式。

在填充組合框項目集合的for循環之後,嘗試手動將所選項目設置爲第一個項目。

foreach (Worksheet temp in xlTemplateWB.Worksheets) 
{ 
    cboBenchSheets.Items.Add(temp.Name); 
} 

cboBenchSheets.SelectedIndex = 0; 
+0

表單的目的是列出工作簿中的工作表並將所選工作表的副本另存爲單獨的工作簿。我有所有的代碼來保存工作表(當工作表名稱被硬編碼時),但我無法從組合框中檢索工作表名稱。我建立的窗體有組合框,一個ok按鈕和一個取消按鈕。點擊確定按鈕後,它會檢查以確保所選值!= null,然後(應該)繼續打開工作表。現在,我無法檢索選定的文本。我只需要知道什麼是正確的語法。謝謝。 –

+0

我明白。我所說的是,如果表單加載並且用戶和代碼都不會在您填充組合框後更改組合框的狀態,那麼即使它看起來像默認情況下選擇了第一個項目,它也不會有選定的值。填充項目集合後,必須明確設置默認選定值。一旦設置了選定的值,您應該可以使用cboBenchSheets.SelectedValue獲取選定的值。 –

+0

對。我正在選擇一個值,然後單擊確定按鈕。 –