winforms 我可以在ListView的详细模式下显示链接吗?

qlzsbp2j  于 2023-03-03  发布在  其他
关注(0)|答案(5)|浏览(95)

我在ListView中显示一组搜索结果,第一列包含搜索词,第二列显示匹配项的数量。
有数万行,因此ListView处于虚拟模式。
我想修改一下,使第二列以超链接的形式显示匹配项,就像LinkLabel显示链接一样;当用户单击链接时,我希望接收一个事件,该事件允许我在应用程序的其他位置打开匹配。
这可能吗?如果可能,又是如何做到的?
编辑:我不认为我已经足够清楚了--我希望在一个列中有 * 多个 * 超链接,就像在一个LinkLabel中有 * 多个 * 超链接一样。

xhv8bpkk

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

注意,这个代码片段检查第二列是否悬停,根据需要调整。

eulz3vhy

eulz3vhy2#

使用ObjectListView--一个标准ListView的开源 Package 器,它支持直接链接:

(来源:codeproject.com
这个食谱记录了(非常简单的)过程,以及如何定制它。

mw3dktmi

mw3dktmi3#

这里的其他答案都很好,但是如果你不想把一些代码拼凑在一起,看看DataGridView控件,它支持LinkLabel等效列。
使用此控件,您可以在ListView中获得详细信息视图的所有功能,但每行具有更多的定制。

zi8p0yeb

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

eoxn13cs5#

您可以将HotTracking设置为true,以便当用户将鼠标悬停在该项上时,该项显示为链接。

相关问题