2011-09-28 98 views
0

我的問題是組合框,第一個項目的文本比組合框長 - 我沒有看到從開始的文本,我看到了結尾文本。我想從一開始就看到文字。我試過'SelectionStart'屬性設置爲0,但它與我的問題無關 - 它只設置從文本中選擇的位置。組合框文本比組合框可見的更長,而不是開始

更詳細的解釋:

我有我的窗體上的幾個組合框,我不得不調整他們的下拉列表寬度以適合最長的項目。所以,當我打開下拉列表時,它的寬度和最長的項目一樣長。但是,有一個問題 - 我有一個特殊的功能,經過組合框列表,早就使他們的下拉寬度最長的項目:

Public Sub MakeDropDownListWider() 
    Dim conKontrola As ComboBox 
    conKontrola = Me 

    'make the dropdown wider so the entire selection can be seen 
    If conKontrola.Items.Count > 0 Then 
     Dim pixlength As Graphics = Graphics.FromHwnd(New IntPtr) 
     Dim lengthHolding As Int32 
     Dim stringWidth As Int32 
     Dim g As Graphics = conKontrola.CreateGraphics 

     For Each myItem As Object In conKontrola.Items 

      If myItem.GetType().ToString() = "System.Data.DataRowView" Then 
       lengthHolding = pixlength.MeasureString(myItem.Row.Item(conKontrola.DisplayMember).ToString, conKontrola.Font).ToSize.Width 
      Else 
       lengthHolding = g.MeasureString(myItem, conKontrola.Font).Width + 15 
      End If 

      If lengthHolding > stringWidth Then 
       stringWidth = lengthHolding 
      End If 
     Next 


     Dim allowedWidth As Int32 = 0 
     If Me.Parent.Width > 0 Then     
      allowedWidth = Me.Parent.Width - conKontrola.Location.X - 10 
     End If 
     If allowedWidth > 0 And (stringWidth + 15 > allowedWidth) Then 
      conKontrola.DropDownWidth = allowedWidth 
     Else 
      conKontrola.DropDownWidth = stringWidth + 15 'add 15 for the scrollbar 
     End If 

    End If 
End Sub 

當我上的每一個組合框運行這個功能我窗體顯示後,我的所有組合框都會被選中。 (我在表單事件中調用此方法)。我不希望被選中組合框,所以我用組合框的SelectionStart財產,像這樣:

myComboBox1.SelectionStart = myComboBox1.Text.Length 

這樣一來,沒有一個組合框似乎被選中。但是,又出現了另一個問題:我只看到組合框上的選擇結束。如果第一個項目很短,那麼一切都很酷。但是,如果第一個項目比組合框長,我只能看到項目的末尾 - 但是,我必須從頭開始項目。因此,f.e .:我的第一個項目是:「C#是Anders Hejlsberg設計的非常好的編程語言」,而且我的組合比文本短,我只會看到「由Anders Hejlsberg設計」。 - 我想看看「C#是一個非常好的編程」。

我無法將'SelectionStart'屬性移動到0,因爲我的所有組合框都被再次選中。即使我這樣做,我仍然看到第一個項目的結束,而不是開始 - 唯一的區別是該項目被選中。

任何想法如何從一開始就看到第一個項目的文本?

回答

1

檢查「從右到左」屬性設置爲false。這可能會導致這個問題。希望這可以幫助。

1

你可以試試這個:

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
    Me.BeginInvoke(New Action(Sub() ComboBox1.Select(0, 0))) 
End Sub