列表视图中的多色子项 - 这可能吗?
multicolor subitem in listview - is it possible?
直奔问题:是否可以在每个字母具有不同颜色的子项中插入一个字符串???
我想用颜色来表示时间延迟。例子:
子项字符串“10 14 50”和值 10 和 50 为红色,14 为绿色。
尝试将 OwnerDraw 模式设置为 true 并自己提供绘图例程:
listView1.OwnerDraw = true;
listView1.DrawColumnHeader += listView1_DrawColumnHeader;
listView1.DrawSubItem += listView1_DrawSubItem;
void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
e.DrawDefault = true;
}
void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) {
if (e.ColumnIndex == 1) {
e.Graphics.SetClip(e.Bounds);
using (SolidBrush br = new SolidBrush(listView1.BackColor)) {
e.Graphics.FillRectangle(br, e.Bounds);
}
int textLeft = e.Bounds.Left;
string[] subItems = e.Item.SubItems[1].Text.Split(' ');
for (int i = 0; i < subItems.Length; ++i) {
int textWidth = TextRenderer.MeasureText(subItems[i], listView1.Font).Width;
TextRenderer.DrawText(e.Graphics, subItems[i], listView1.Font,
new Rectangle(textLeft, e.Bounds.Top, textWidth, e.Bounds.Height),
i == 0 ? Color.Red : i == subItems.Length - 1 ? Color.Green : Color.Black,
Color.Empty,
TextFormatFlags.VerticalCenter | TextFormatFlags.PreserveGraphicsClipping);
textLeft += textWidth;
}
e.Graphics.ResetClip();
} else {
e.DrawDefault = true;
}
}
结果:
直奔问题:是否可以在每个字母具有不同颜色的子项中插入一个字符串???
我想用颜色来表示时间延迟。例子: 子项字符串“10 14 50”和值 10 和 50 为红色,14 为绿色。
尝试将 OwnerDraw 模式设置为 true 并自己提供绘图例程:
listView1.OwnerDraw = true;
listView1.DrawColumnHeader += listView1_DrawColumnHeader;
listView1.DrawSubItem += listView1_DrawSubItem;
void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
e.DrawDefault = true;
}
void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) {
if (e.ColumnIndex == 1) {
e.Graphics.SetClip(e.Bounds);
using (SolidBrush br = new SolidBrush(listView1.BackColor)) {
e.Graphics.FillRectangle(br, e.Bounds);
}
int textLeft = e.Bounds.Left;
string[] subItems = e.Item.SubItems[1].Text.Split(' ');
for (int i = 0; i < subItems.Length; ++i) {
int textWidth = TextRenderer.MeasureText(subItems[i], listView1.Font).Width;
TextRenderer.DrawText(e.Graphics, subItems[i], listView1.Font,
new Rectangle(textLeft, e.Bounds.Top, textWidth, e.Bounds.Height),
i == 0 ? Color.Red : i == subItems.Length - 1 ? Color.Green : Color.Black,
Color.Empty,
TextFormatFlags.VerticalCenter | TextFormatFlags.PreserveGraphicsClipping);
textLeft += textWidth;
}
e.Graphics.ResetClip();
} else {
e.DrawDefault = true;
}
}
结果: