我在ListView中显示一组搜索结果,第一列包含搜索词,第二列显示匹配项的数量。有数万行,因此ListView处于虚拟模式。我想修改一下,使第二列以超链接的形式显示匹配项,就像LinkLabel显示链接一样;当用户单击链接时,我希望接收一个事件,该事件允许我在应用程序的其他位置打开匹配。这可能吗?如果可能,又是如何做到的?编辑:我不认为我已经足够清楚了--我希望在一个列中有 * 多个 * 超链接,就像在一个LinkLabel中有 * 多个 * 超链接一样。
ListView
LinkLabel
xhv8bpkk1#
您可以轻松地伪造它。确保添加的列表视图项具有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; } }
注意,这个代码片段检查第二列是否悬停,根据需要调整。
eulz3vhy2#
使用ObjectListView--一个标准ListView的开源 Package 器,它支持直接链接:
(来源:codeproject.com)这个食谱记录了(非常简单的)过程,以及如何定制它。
mw3dktmi3#
这里的其他答案都很好,但是如果你不想把一些代码拼凑在一起,看看DataGridView控件,它支持LinkLabel等效列。使用此控件,您可以在ListView中获得详细信息视图的所有功能,但每行具有更多的定制。
DataGridView
zi8p0yeb4#
您可以通过继承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); } }
eoxn13cs5#
您可以将HotTracking设置为true,以便当用户将鼠标悬停在该项上时,该项显示为链接。
5条答案
按热度按时间xhv8bpkk1#
您可以轻松地伪造它。确保添加的列表视图项具有UseItemStyleForSubItems = false,以便可以将子项的ForeColor设置为蓝色。实现MouseMove事件,以便可以为“链接”添加下划线并更改光标。例如:
注意,这个代码片段检查第二列是否悬停,根据需要调整。
eulz3vhy2#
使用ObjectListView--一个标准ListView的开源 Package 器,它支持直接链接:
(来源:codeproject.com)
这个食谱记录了(非常简单的)过程,以及如何定制它。
mw3dktmi3#
这里的其他答案都很好,但是如果你不想把一些代码拼凑在一起,看看
DataGridView
控件,它支持LinkLabel
等效列。使用此控件,您可以在
ListView
中获得详细信息视图的所有功能,但每行具有更多的定制。zi8p0yeb4#
您可以通过继承ListView控件覆盖OnDrawSubItem方法。
这里是一个非常简单的例子,你可能会怎么做:
eoxn13cs5#
您可以将HotTracking设置为true,以便当用户将鼠标悬停在该项上时,该项显示为链接。