我在ListView
中显示一组搜索结果。第一列包含搜索词,第二列显示匹配数。
有数万行,因此ListView
处于虚拟模式。
我想更改此内容,以便第二列将匹配显示为超链接,与LinkLabel
显示链接的方式相同;当用户点击链接时,我希望收到一个活动,让我在我们的应用程序的其他地方打开匹配。
这是可能的,如果是的话,怎么样?
编辑:我认为我不够清楚 - 我希望在一个列中有多个超链接,就像可以在多个超链接中一样一个LinkLabel
。
答案 0 :(得分:8)
你很容易伪造它。确保您添加的列表视图项具有UseItemStyleForSubItems = false,以便您可以将子项的ForeColor设置为蓝色。实现MouseMove事件,以便为“链接”加下划线并更改光标。例如:
ListViewItem.ListViewSubItem mSelected;
private void listView1_MouseMove(object sender, MouseEventArgs e) {
var info = listView1.HitTest(e.Location);
if (info.SubItem == mSelected) return;
if (mSelected != null) mSelected.Font = listView1.Font;
mSelected = null;
listView1.Cursor = Cursors.Default;
if (info.SubItem != null && info.Item.SubItems[1] == info.SubItem) {
info.SubItem.Font = new Font(info.SubItem.Font, FontStyle.Underline);
listView1.Cursor = Cursors.Hand;
mSelected = info.SubItem;
}
}
请注意,此代码段会检查第二列是否悬停,并根据需要进行调整。
答案 1 :(得分:3)
答案 2 :(得分:1)
此处的其他答案很棒,但如果您不想一起破解某些代码,请查看支持DataGridView
等效列的LinkLabel
控件。
使用此控件,您可以在ListView
中获得详细信息视图的所有功能,但每行可以进行更多自定义。
答案 3 :(得分:1)
您可以通过继承ListView控件覆盖方法OnDrawSubItem 以下是一个非常简单的示例:
public class MyListView : ListView
{
private Brush m_brush;
private Pen m_pen;
public MyListView()
{
this.OwnerDraw = true;
m_brush = new SolidBrush(Color.Blue);
m_pen = new Pen(m_brush)
}
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
e.DrawDefault = true;
}
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
if (e.ColumnIndex != 1) {
e.DrawDefault = true;
return;
}
// Draw the item's background.
e.DrawBackground();
var textSize = e.Graphics.MeasureString(e.SubItem.Text, e.SubItem.Font);
var textY = e.Bounds.Y + ((e.Bounds.Height - textSize.Height) / 2);
int textX = e.SubItem.Bounds.Location.X;
var lineY = textY + textSize.Height;
// Do the drawing of the underlined text.
e.Graphics.DrawString(e.SubItem.Text, e.SubItem.Font, m_brush, textX, textY);
e.Graphics.DrawLine(m_pen, textX, lineY, textX + textSize.Width, lineY);
}
}
答案 4 :(得分:0)
您可以将HotTracking 设置为true,这样当用户将鼠标悬停在该项目上时,它就会显示为链接。