2009-12-11 7 views

答えて

10

ListViewコントロールは、ネイティブでサブアイテムの画像をサポートしていません。最も簡単な方法は、DataGridViewに切り替えてDataGridViewImageColumnを使用することです。それが不可能な場合は、ListViewコントロールのカスタム描画サポートを使用して、自分でアイコンを描画する必要があります。これを行うには、ListView.OwnerDraw = trueと設定し、ListView.DrawSubItemListView.DrawColumnHeaderのイベントを処理します。

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 
{ 
    // Only interested in 2nd column. 
    if (e.Header != this.columnHeader2) 
    { 
     e.DrawDefault = true; 
     return; 
    } 

    e.DrawBackground(); 
    var imageRect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height); 
    e.Graphics.DrawImage(SystemIcons.Information.ToBitmap(), imageRect); 
} 

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) 
{ 
    e.DrawDefault = true; 
} 
+0

なぜ 'var imageRect = e.Bounds; 'だけではなく、値がコピーされて参照されないようにすることで安全に扱えるようにするための値型です。 – ja72

+0

実際の使用状況では、サブアイテムに含まれるアライメント、パディング、および/または追加のコンテンツを考慮してimageRectを調整することができます。 –

2

のListViewから継承し、独自のアイコンを描画します。

public class MyListView : ListView 
{ 
    protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e) 
    { 
     base.OnDrawSubItem(e); 
    } 
} 
6

使用P /呼び出しと、リストビューにLVM_SETITEMメッセージを送る(あなたがコントロールの作成やLVM_SETEXTENDEDLISTVIEWSTYLE経由LVS_EX_SUBITEMIMAGESのスタイルを設定する必要があります)、サブ項目のインデックスと対応する画像のインデックスを指定します。あなたが挿入するすべてのリスト項目のためにそれを行う必要があります。

5

ObjectListViewは、.NET Winforms ListViewのオープンソースラッパーです。これは、@ ligget78が言及したp/invoke戦略を使用して、サブアイテム上のイメージをサポートします。また、ListViewの他の多くの一般的な問題を解決します。

それはあなたが最小限の労力で非常に見栄えの良いリストビューを作成することができます

alt text http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot2.png

0

アイコンは「最初の」列に表示され、これもキーボードプレフィックス検索の基礎となります。考えられる解決策の1つは、最初の列のDisplayIndexを別のものに設定して列の順序を変更することです。

listView1.Columns[0].DisplayIndex = 1; 

これはもちろん、1つの列にアイコンが必要な場合にのみ有効です。