如何使用c#将图标设置为listview的子项?

J.D*_*Doe 2 c#

我有listview控件.可以从图像列表中选择imageindex并将图像设置为listview 项目但是如何将图标设置为listview 子项目

        listView1.Columns.Add("Objects");
        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        listView1.SmallImageList = imageList1;
        listviewitem = new ListViewItem("David", 1);
        listviewitem.SubItems.Add("John");
        this.listView1.Items.Add(listviewitem);
        listView1.View = View.Details;
Run Code Online (Sandbox Code Playgroud)

我想将图像设置为subitem - 名为"John".

TaW*_*TaW 6

你只能有一个图像ListViewItem,它必须与主图像ListViewItem(即SubItems[0].)

但您可以更改显示顺序,以便可以在任何列中显示图像.

listView1.Columns[0].DisplayIndex = 2;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,当然你也可以所有者绘制ListView,包括带图像的任何数量SubItems!这将需要更多的代码行(大约十几个),但它可以让你以ListView任何你喜欢的方式设置样式.

这是一个在所有列中都有(随机)图像的示例:

在此输入图像描述

要获得此结果,您需要..:

  • OwnerDraw = true为LV 设置
  • UseItemStyleForSubItems = false为所有项目设置
  • 编码所有三个Drawxxx事件.
  • 决定如何存储对第二个(etc)图像的引用,因为SubItem该类没有ImageIndex.

您可以使用TagSubItem持有ImageIndex数量,或者,如果你不需要Text,你可以设置文本,所以你可以使用它作为指标,甚至作为Key进入ImageList.

其中两个事件很简单:

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

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}
Run Code Online (Sandbox Code Playgroud)

第三个是你实际绘图的地方:

    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
    {
        e.DrawBackground();
        Size sz = listView1.SmallImageList.ImageSize;
        int idx = 0;
        if (e.SubItem.Tag != null) idx = (int)e.SubItem.Tag;
        Bitmap bmp = (Bitmap)listView1.SmallImageList.Images[idx];
        Rectangle rTgt = new Rectangle(e.Bounds.Location, sz);
        bool selected = e.ItemState.HasFlag(ListViewItemStates.Selected);
        // optionally show selection:
        if (selected ) e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds);

        if (bmp != null) e.Graphics.DrawImage(bmp, rTgt);

        // optionally draw text
        e.Graphics.DrawString(e.SubItem.Text, listView1.Font,
                              selected  ? Brushes.White: Brushes.Black,
                              e.Bounds.X + sz.Width + 2, e.Bounds.Y + 2);
    }
Run Code Online (Sandbox Code Playgroud)

当然,您需要将图像和可能的文本绘制限制为您需要的列.添加更多检查应该很简单..