我有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".
你只能有一个图像ListViewItem,它必须与主图像ListViewItem(即SubItems[0].)
但您可以更改显示顺序,以便可以在任何列中显示图像.
listView1.Columns[0].DisplayIndex = 2;
Run Code Online (Sandbox Code Playgroud)
但是,当然你也可以所有者绘制的ListView,包括带图像的任何数量的SubItems!这将需要更多的代码行(大约十几个),但它可以让你以ListView任何你喜欢的方式设置样式.
这是一个在所有列中都有(随机)图像的示例:
要获得此结果,您需要..:
OwnerDraw = true为LV 设置UseItemStyleForSubItems = false为所有项目设置Drawxxx事件.SubItem该类没有ImageIndex.您可以使用Tag的SubItem持有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)
当然,您需要将图像和可能的文本绘制限制为您需要的列.添加更多检查应该很简单..
| 归档时间: |
|
| 查看次数: |
525 次 |
| 最近记录: |