Могу ли я отображать ссылки в детальном режиме ListView? - PullRequest
4 голосов
/ 18 февраля 2010

Я отображаю набор результатов поиска в ListView. В первом столбце содержится критерий поиска, а во втором - количество совпадений.

Есть десятки тысяч строк, поэтому ListView находится в виртуальном режиме.

Я бы хотел изменить это так, чтобы второй столбец отображал совпадения в виде гиперссылок, так же, как LinkLabel показывает ссылки; когда пользователь нажимает на ссылку, я хотел бы получить событие, которое позволит мне открыть совпадение в другом месте нашего приложения.

Возможно ли это, и если да, то как?

РЕДАКТИРОВАТЬ: Я не думаю, что я был достаточно ясен - я хочу несколько гиперссылок в одном столбце, так же как возможно иметь несколько гиперссылок в одном LinkLabel.

Ответы [ 5 ]

8 голосов
/ 18 февраля 2010

Вы можете легко подделать его. Убедитесь, что у элементов списка, которые вы добавляете, есть 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;
  }
}

Обратите внимание, что этот фрагмент проверяет, наведен ли второй столбец, при необходимости отрегулируйте.

3 голосов
/ 21 февраля 2010

Использование ObjectListView - обертка с открытым исходным кодом вокруг стандартного ListView. Поддерживает ссылки напрямую:

alt text

Этот рецепт описывает (очень простой) процесс и способ его настройки.

1 голос
/ 18 февраля 2010

Вы можете, унаследовав 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);
    }
}
1 голос
/ 18 февраля 2010

Другие ответы здесь хороши, но если вы не хотите взламывать код вместе, посмотрите на элемент управления DataGridView, который поддерживает LinkLabel эквивалентные столбцы.

Используя этот элемент управления, вы получаете все функциональные возможности представления сведений в ListView, но с большей настройкой для строки.

0 голосов
/ 18 февраля 2010

Можно установить HotTracking в значение true, чтобы при наведении курсора мыши на элемент он отображался как ссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...