2016-04-28 30 views
-1

listboxの現在使用可能な項目をすべて太字に設定しようとしています。そして、後でアイテムが追加されると、それらはデフォルトフォントを持ちます。ユーザーは最初にリストされたアイテムと新しいアイテムを視覚的に見ることができます。リストボックスの項目を(太字で)設定してください。太字のフォント

フォームコンストラクタから、私はこのようなリストボックスを埋めます。これらは、追加される初期値です。

Private Sub FillLinkedBox(ByVal oReferenceList As String()) 

    ' Fill the linked listbox with the current linked items 
    Debug.Print(oReferenceList.ToString) 
    lbLinkedParameters.Items.AddRange(oReferenceList) 

    ' Set the font of all the existing items in the listbox 
    For i As Integer = 0 To lbLinkedParameters.Items.Count - 1 

     ' Set the font to bold for these items. 

    Next 

End Sub 

ので、私は初期値とするものではなかったものを確定することができます(私はまた、メモリ内のリストを保持し、アイテムをかどうかを確認できを処理する際、ユーザーは、私はまた、アイテムのフォントをテストしたい終了した後フォントチェックが適切なオプションでない場合はリストされます)。

見つかった場合はpostこの操作を行う必要があるものの、イベントに基づいています。私はそれがどのように機能するのか分かりません。

Dim buttonPressed As Boolean 
Private Sub ListBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem 
e.DrawBackground() 

    If ListBox1.SelectedIndices.Contains(e.Index) And buttonPressed Then 
     e.Graphics.DrawString(ListBox1.Items(e.Index), e.Font, Brushes.Green, e.Bounds.X, e.Bounds.Y) 

    Else 
     e.Graphics.DrawString(ListBox1.Items(e.Index), e.Font, Brushes.Black, e.Bounds.X, e.Bounds.Y) 
    End If 
    If e.Index = ListBox1.Items.Count - 1 Then 
     buttonPressed = False 
    End If 
    e.DrawFocusRectangle() 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    buttonPressed = True 
    ListBox1.Refresh() 
End Sub 

私の質問は、どのようにして指定されたインデックスのリストボックスアイテムのフォントを変更できますか?

+0

は代わりのDataGridViewを使用してみてください。行とセルをフォーマットする方が簡単です –

+0

Trueですが、比較的難易度の低い 'ListBox'を使って行えます。 – user7777777

答えて

0

e.IndexはあなたがにListControl(リスト/コンボ)を設定した場合

Dim useFont as Font = e.Font 
    Select Case e.Index 
     Case 0 
      'Set Font to Bold 
      useFont = New Font(e.Font, FontStyle.Bold) 
    End Select 

    ' Draw the current item text based on the current 
    ' Font and the custom brush settings. 
    e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), _ 
    useFont, e.Brush, e.Bounds, StringFormat.GenericDefault) 
+0

「e」とは何ですか?私の質問に示されているようにイベントargs? –

1

it's based on an event; and I don't understand how it works.

を変更したい項目の番号であり、フォントの変数を作成し、ListBoxの任意の項目をカスタマイズOwnerDraw、Windowsはアイテムを描画する必要があるたびにDrawItemイベントが発生します。色、フォントなどを変更するためのコードを提供することができます。

After the user is finished I would also like to test the items font when processing

問題は、フォントが項目の状態に基づいていることです。あなたがそれを説明したように、それはアイテムがオリジナルか追加されたものかどうかです。その状態はインデックスから判断することはできません。また、後でのような視覚的な要素からその状態を再決定することもできません。(あなたもそうです)。

だから、当面の作業は本当に2つの関連のものである:

  1. /Aコードは彼らに

この意志を決定することができるよう

  • は何とか彼らを追跡し、新規追加されたアイテムをユーザーに表示します任意のクラスに追加できるインターフェイスを使用します。これにより、この解決策は、この1つのローカライズされたケースに対してあまり具体的ではない。

    Public Interface IListItem 
        Property Selected As Boolean 
        Function GetDisplayText() As String ' not really needed 
    End Interface 
    

    コードでは、追加されたアイテムを追跡して描画するためにSelectedが使用されます。必要に応じて名前を変更しますが、ドローコードも変更する必要があります。

    Public Class SimpleThing 
        Implements IListItem 
    
        ' your stuff 
        Public Property Name As String 
        Public Property Value As Int32 
        Public Property Foo As Int32 
        Public Property Bar As Single  
    
        Public Property Selected As Boolean Implements IListItem.Selected 
    
        Public Sub New(n As String, v As Int32, 
           Optional b As Boolean = True) 
         Name = n 
         Value = v 
         Selected = b 
        End Sub 
    
        Public Function GetDisplayText() As String Implements IListItem.GetDisplayText 
         Return Name 
        End Function 
    
        Public Overrides Function ToString() As String 
         Return Name 
        End Function 
    End Class 
    

    GetDisplayText項目が他の状況に対してListControlに表示されたときに異なるテキスト出力を可能にすることです。それは難しい要件ではありません。あなたが必要とするこれらの事について何の情報を格納することができ

    SimpleThingListBox/ComboBoxは、描画だけでIListItemの要素に依存しています。 UIコントロールがOwnerDrawFixedに設定されている

    ListThings = New List(Of SimpleThing) 
    ... 
    ListThings.Add(New SimpleThing("Able", 42, True)) 
    ListThings.Add(New SimpleThing("Baker", 7, True)) 
    ... 
    ListThings.Add(New SimpleThing("Ziggy", 6, True)) 
    
    lbEnabler.DataSource = ListThings 
    lbEnabler.DisplayMember = "Name" 
    lbEnabler.ValueMember = "Value" 
    

    と項目を描画するために、このコードを使用しています:あなたはDataSourceとしてリストを使用してコントロールを作成することができます

    Private Sub lst_DrawItem(sender As Object, 
            e As DrawItemEventArgs) Handles lbEnabler.DrawItem 
        Dim lb As ListBox = CType(sender, ListBox) 
        If e.Index < 0 Then 
         TextRenderer.DrawText(e.Graphics, "", lb.Font, e.Bounds, lb.ForeColor) 
         Return 
        End If 
    
        Dim bg As Color = If(e.State.HasFlag(DrawItemState.Selected), 
             SystemColors.Highlight, SystemColors.Window) 
        Dim fg As Color = If(e.State.HasFlag(DrawItemState.Selected), 
             SystemColors.HighlightText, SystemColors.WindowText) 
    
        Dim iItem As IListItem 
        If TypeOf lb.Items(e.Index) Is IListItem Then 
         iItem = CType(lb.Items(e.Index), IListItem) 
        Else 
         TextRenderer.DrawText(e.Graphics, lb.Items(e.Index).ToString, lb.Font, e.Bounds, 
               fg, bg, TextFormatFlags.Left Or 
               TextFormatFlags.VerticalCenter) 
         Return 
        End If 
        e.DrawBackground() 
    
        If iItem.Selected Then   ' change to IsOrginal or IsBold 
         Using f As New Font(lb.Font.FontFamily, lb.Font.Size, FontStyle.Bold) 
          TextRenderer.DrawText(e.Graphics, iItem.GetDisplayText(), f, e.Bounds, 
                fg, bg, TextFormatFlags.Left Or 
                TextFormatFlags.VerticalCenter) 
         End Using 
        Else 
         ' default 
         TextRenderer.DrawText(e.Graphics, iItem.GetDisplayText(), lb.Font, e.Bounds, 
               fg, bg, TextFormatFlags.Left Or 
               TextFormatFlags.VerticalCenter) 
        End If 
    
    End Sub 
    

    結果:

    enter image description here

    個人的には、私はそれは非常に良いプレゼンテーションだとは思わない。それは非標準であり、太字のが表すものはすぐには分かりません。

    enter image description here

    緑色のプラスバージョンはどれが追加された、それはかなり明らかに:しかし、あなたは、このようなグラフィック指標を追加するとDrawItemイベントでやりたいことができます。アイテムのコレクションだけでも、ポーリングの問題を追加されたアイテムの取得:

    Dim added = myListBox.Items. 
           Cast(Of SimpleThing). 
           Where(Function(f) f.Selected). 
           ToArray() 
    
  • +0

    これが質問に答える場合は、チェックマークをクリックして、これが未回答リストから外されるようにしてください。 – Plutonix

    関連する問題