C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: コンボボックスの表示


(過去ログ 134 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■79262 / inTopicNo.1)  コンボボックスの表示
  
□投稿者/ imy (1回)-(2016/03/18(Fri) 20:41:35)

分類:[.NET 全般] 

コンボボックスの表示で、内部で保持する値と表示用の値と両方表示させたいのですがどなたかご存知の方お願いします

内部の値 表示用の値
001 北海道
002 青森
003 岩手
: :

上記のように内部の値と表示用の値と両方表示するやり方です

引用返信 編集キー/
■79267 / inTopicNo.2)  Re[1]: コンボボックスの表示
□投稿者/ shu (847回)-(2016/03/18(Fri) 22:06:20)
No79262 (imy さん) に返信

Button1の処理は文字列を連結してしまう方法
Button2の処理は描画を独自に行う方法

文字列連結のほうが簡単ですが文字位置のずれが発生しやすくなります。

Public Class Form1
    Private _ComboItems As ListComboItem
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        _ComboItems = New ListComboItem From {{"00", "北海道"}, {"01", "青森県"}}
        ComboBox1.DataSource = _ComboItems
        ComboBox1.ValueMember = "Value"
        ComboBox1.DisplayMember = "Disp"
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        _ComboItems = New ListComboItem From {{"00", "北海道"}, {"01", "青森県"}}
        ComboBox2.DataSource = _ComboItems
        ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
        ComboBox2.ValueMember = "Value"
        ComboBox2.DisplayMember = "Disp"

        ComboBox2.DrawMode = DrawMode.OwnerDrawFixed
        ComboBox2.DropDownWidth = 100
    End Sub

    Private Sub ComboBox2_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox2.DrawItem
        e.DrawBackground()
        Dim g = e.Graphics

        If (e.State And DrawItemState.ComboBoxEdit) > 0 Then
            '編集部分特有の処理
        End If

        Dim itm = DirectCast(ComboBox2.Items(e.Index), ComboItem)
        g.DrawString(itm.Value, ComboBox2.Font, Brushes.Black, e.Bounds.Left, e.Bounds.Top)
        g.DrawString(itm.Name, ComboBox2.Font, Brushes.Black, e.Bounds.Left + 20, e.Bounds.Top)
        e.DrawFocusRectangle()
    End Sub

End Class

Public Class ComboItem
    Public Property Value As String
    Public Property Name As String

    Public ReadOnly Property Disp As String
        Get
            Return String.Format($"{Value} {Name}")
        End Get
    End Property

    Public Overloads Function tostring()
        Return Disp
    End Function
End Class

Public Class ListComboItem
    Inherits List(Of ComboItem)

    Public Sub New()
        MyBase.New()
    End Sub

    Public Overloads Function Add(Value As String, Name As String)
        Dim ret As New ComboItem() With {.Value = Value, .Name = Name}
        Me.Add(ret)
        Return ret
    End Function

End Class

引用返信 編集キー/
■79268 / inTopicNo.3)  Re[1]: コンボボックスの表示
□投稿者/ Azulean (615回)-(2016/03/18(Fri) 22:07:57)
No79262 (imy さん) に返信
> コンボボックスの表示で、内部で保持する値と表示用の値と両方表示させたいのですがどなたかご存知の方お願いします

そういったクラスを作って、ComboBox に追加すれば良いかと思います。

public class Sample
{
  public int Number { get; set; }
  public string DisplayText { get; set; }

  public override string ToString()
  {
    return string.Format("{0:000} {1}", Number, DisplayText);
  }
}


// 追加処理を書く部分(コンストラクタとか、Load イベントなど)
comboBox1.Items.Add(new Sample { Number = 1, DisplayText = "北海道" });
comboBox1.Items.Add(new Sample { Number = 2, DisplayText = "青森" });
comboBox1.Items.Add(new Sample { Number = 3, DisplayText = "岩手" });

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -