2012-01-31 94 views
0

對於ComboBox,當我設置SelectionLength = 0,I得到的錯誤:ComboBox.SelectionLength = 0拋出異常InvalidArgument

InvalidArgument=Value of '-1470366488' is not valid for 'start'. 
Parameter name: start 
Stack Trace: 
at System.Windows.Forms.ComboBox.Select(Int32 start, Int32 length) 
at System.Windows.Forms.ComboBox.set_SelectionLength(Int32 value) 
at MyCompany.Odin.WebClient.STComplexView.loadViewFormats() 

這不是一個後Clear(),也不是綁定控件。

的(不那麼)有趣的這段代碼的事情:

//Adding Items to the combo box (6 in total) 
// ... 
viewFormatComboBox.Items.Add(appResMgr.GetString("STR_6X2_HEXAXIAL")); 
viewFormatComboBox.SelectedIndex = 2; 
viewFormatComboBox.SelectionLength = 0; //<<<< The exception is thrown here 

無處在我們的代碼我們指定SelectionStart,但它已經得到了-1470366488值,當我到達我上面包含的代碼。我假設組合框做了

ComboBox.Select(Int32 start, Int32 length) 

調用,通過設置SelectionLength觸發時,這是使用。我假設SelectionStart用於啓動參數和中提琴,我們在上面顯示了InvalidExceptionArgument。

這是調試代碼。風格是DropDownStyle,其他一切看起來都不起眼,但在調試器中,我看到SelectionStart屬性爲-1470366488。

這段代碼已經存在了好幾年了,今天我第一次遇到這個異常,當測試一個調試版本時。我使用SelectedIndex = 2行選擇要顯示的項目,然後在設置SelectionLength時出現異常 有任何解釋?

+0

我認爲問題在於你對「選擇」的解釋 - 你想在組合框中選擇文本,還是你想要選擇一個項目? – davisoa 2012-01-31 20:22:05

+1

嗯。根據例外情況,您爲該值指定了「-1470366488」,而不是0.您顯示的代碼實際上並未包含設置「SelectedIndex」屬性的行,因此我無法說出出錯了。 'SelectionStart'與'SelectedIndex'無關;這可能是混淆的根源嗎? – 2012-01-31 20:30:10

+0

davisoa - 我試圖確保在文本框中沒有選中任何文本。 – 2012-01-31 20:38:56

回答

2

從異常和調用堆棧看起來最簡單的解決辦法是插入:

viewFormatComboBox.SelectionStart = 0; 

viewFormatComboBox.SelectionLength = 0; 

,以確保它有一個有效的價值。

+0

這就是我所做的,儘管我不確定發生了什麼變化來解決這個問題。 – 2012-02-15 21:30:32

1

下面是對什麼而不是爲什麼的解釋。

爲SelectionLength的制定者呼籲:

this.Select(this.SelectionStart, value); 

第一線檢查精氨酸有效性

if (start < 0) 
     { 
     throw new ArgumentOutOfRangeException("start", System.Windows.Forms.SR.GetString("InvalidArgument", (object) "start", (object) start.ToString((IFormatProvider) CultureInfo.CurrentCulture))); 
     } 

正如你指出,你的SelectionStart爲-1470366488的值。問題是爲什麼? SelectionStart調用的吸氣劑:

int[] wParam = new int[1]; 
System.Windows.Forms.UnsafeNativeMethods.SendMessage(new HandleRef((object) this, this.Handle), 320, wParam, (int[]) null); 
return wParam[0]; 

消息320(0x140)是CB_GETEDITSEL。根據docs,應該返回:

Gets the starting and ending character positions of the current selection in the edit control of a combo box.

顯然不是這樣。它返回-1470366488。爲什麼?誰知道。我猜測CB_GETEDITSEL正在返回一個錯誤,它沒有被檢查,並且wParam [0]是未定義的,框架只是盲目地使用它。

也許在設置SelectionLength之前明確地設置SelectionStart(它發送一個CB_SETEDITSEL)將使其發生的可能性最小化。

+0

斯蒂芬尼斯細分 - 接近解釋,謝謝! – 2012-02-01 14:44:39

1

對於DropDownList組合框樣式,組合框控件實際上沒有「文本」框實體。因此,如上所述,設置該對象的SelectionStart或SelectionLength具有不可預知的結果。正如在其他職位(Weird behavior caused by using .Net ComboBox properties SelectionStart & SelectionLength in "DropDownList" modehttp://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/80B562C9-981E-48E6-8737-727CE5553CBB)中提到的,也建議不要使用這些屬性,我明白了爲什麼。但是,測試這種風格,而不是設置開始值解決了我們的問題。

如果不Me.DropDownStyle.Equals(Windows.Forms.ComboBoxStyle.DropDownList)然後 Me.SelectionStart = Me.Text.Length 結束如果

希望這可以幫助別人的未來...