代码之家  ›  专栏  ›  技术社区  ›  Leri Gogsadze

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

c#
  •  5
  • Leri Gogsadze  · 技术社区  · 7 年前

    但如何将图标设置为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;
    

    我想将图像设置为名为“John”的子项。

    1 回复  |  直到 7 年前
        1
  •  9
  •   TaW    7 年前

    你只能 ListViewItem ListViewItem SubItems[0]

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

    listView1.Columns[0].DisplayIndex = 2;
    

    enter image description here

    但是 ,当然你也可以 这个 ListView 任意数字 属于 SubItems ! 这将需要更多的代码行(大约12行),但它将允许您对

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

    enter image description here

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

    您可以使用 Tag 子项 举行 或者,如果您不需要 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;
    }
    

    第三个是你实际画画的地方:

        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);
        }
    

    当然,您希望将图像和文本的绘制限制为您需要的列。。添加更多支票应该很简单。。