DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンボボックスのリスト表示部のイベント

環境/言語:[WindowsXP Visual C# 2008]
分類:[.NET]

コンボボックスの▼をマウスでクリックして、リストが表示された状態で、
表示されたリスト部分をマウスでポイントするとその行が反転しますが、
反転した時のイベントは発生しないのですか?
リストの項目ごとに吹き出しもたいなものを表示できたらと思っています。
お疲れ様です。

> 反転した時のイベントは発生しないのですか?
ComboBoxをOwnerDrawして、DrawItemイベントを拾う方法が考えられます。
試してみてください。

# 吹き出しの表示方法は分かりませんでした。
# もっとよい方法がないか私も調べてみます。

' ComboBox1をFormに配置してください
Public Class Form8

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

        With Me.ComboBox1
            .DrawMode = DrawMode.OwnerDrawFixed
            .ValueMember = "Code"
            .DisplayMember = "Name"
            .DataSource = Me._helperCreateDataTable
        End With

        MyBase.OnLoad(e)
    End Sub

    Private Function _helperCreateDataTable() As DataTable
        Dim dt As New DataTable
        dt.Columns.Add("Code", GetType(String))
        dt.Columns.Add("Name", GetType(String))

        For i As Integer = 1 To 6
            dt.Rows.Add("Code" + i.ToString, "値" + i.ToString)
        Next

        Return dt
    End Function

    Private Sub ComboBox1_DrawItem(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
        Dim cbo As ComboBox = Me.ComboBox1
        Console.WriteLine("DrawItem")

        e.DrawBackground()

        Dim br As Brush
        If e.State = DrawItemState.Selected Then
            br = SystemBrushes.HighlightText
        Else
            br = SystemBrushes.WindowText
        End If

        Dim o As Object = DirectCast(cbo.Items(e.Index), DataRowView).Item(cbo.DisplayMember)
        e.Graphics.DrawString(Convert.ToString(o), cbo.Font, br, e.Bounds)

    End Sub

End Class
H.K.R.さん
ありがとうございます。

勉強不足で、VBからC#に変換したのですが・・・
なかなかエラーが取れなく苦戦しています。
DataTableってなんでしょうか?

> Private Function _helperCreateDataTable() As DataTable
> Dim dt As New DataTable
> dt.Columns.Add("Code", GetType(String))
> dt.Columns.Add("Name", GetType(String))
>
> For i As Integer = 1 To 6
> dt.Rows.Add("Code" + i.ToString, "値" + i.ToString)
> Next
>
> Return dt
> End Function
H.K.R.さん

DataTableはusing System.Data;で自己解決しました。
お恥ずかしいです。


変換前
Dim o As Object = DirectCast(cbo.Items(e.Index), DataRowView).Item(cbo.DisplayMember)

変換後
object o = ((DataRowView)cbo.Items(e.Index)).Item(cbo.DisplayMember);

ですが、cbo.ItemsのItemsが
実行不可能なメンバ 'System.Windows.Forms.ComboBox.Items' をメソッドのように使用することはできません。
のエラーが出てしまいました。
どのようにすればよいのでしょうか?
> 変換後
> object o = ((DataRowView)cbo.Items(e.Index)).Item(cbo.DisplayMember);
>
> ですが、cbo.ItemsのItemsが
> 実行不可能なメンバ 'System.Windows.Forms.ComboBox.Items' をメソッドのように使用することはできません。
> のエラーが出てしまいました。
> どのようにすればよいのでしょうか?

C# の場合、要素へのアクセスは [] になります。

object o = ((DataRowView)cbo.Items[e.Index]).Item[cbo.DisplayMember];
ひらぽんさん
ありがとうございます。

■No25472に返信(ひらぽんさんの記事)
>>変換後
>>object o = ((DataRowView)cbo.Items(e.Index)).Item(cbo.DisplayMember);
>>
>>ですが、cbo.ItemsのItemsが
>>実行不可能なメンバ 'System.Windows.Forms.ComboBox.Items' をメソッドのように使用することはできません。
>>のエラーが出てしまいました。
>>どのようにすればよいのでしょうか?
>
> C# の場合、要素へのアクセスは [] になります。
>
> object o = ((DataRowView)cbo.Items[e.Index]).Item[cbo.DisplayMember];
>
>

[]にしたら、また新たなエラーが出てしまいました。

'System.Data.DataRowView' に 'Item' の定義が含まれておらず、型 'System.Data.DataRowView' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

usingはSystem.Datadだけではだめなのでしょうか?
> []にしたら、また新たなエラーが出てしまいました。
>
> 'System.Data.DataRowView' に 'Item' の定義が含まれておらず、型 'System.Data.DataRowView' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

> usingはSystem.Datadだけではだめなのでしょうか?

以下でいけると思います。

object o = ((DataRowView)cbo.Items[e.Index])[cbo.DisplayMember];
ひらぽんさん
ありがとうございます。
無事にエラーが取れました。

後はマウスポインタで反転したときに吹き出しみたいに表示させるのを
がんばってみます。

■No25474に返信(ひらぽんさんの記事)
>>[]にしたら、また新たなエラーが出てしまいました。
>>
>>'System.Data.DataRowView' に 'Item' の定義が含まれておらず、型 'System.Data.DataRowView' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
>
>>usingはSystem.Datadだけではだめなのでしょうか?
>
> 以下でいけると思います。
>
> object o = ((DataRowView)cbo.Items[e.Index])[cbo.DisplayMember];
>

DOBON.NET | プログラミング道 | プログラミング掲示板