Winforms ListView TopItem изменили событие? - PullRequest
1 голос
/ 09 января 2012

Возникает ли какое-либо событие, когда изменяется свойство верхнего элемента в виде списка выигрышной формы?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Вам потребуется событие Scroll, чтобы обнаружить, что TopItem мог измениться.ListView не имеет его.Что, вероятно, является преднамеренным, класс содержит некоторые хаки, которые работают с ошибками в родном элементе управления Windows, хаки, использующие прокрутку.

Эти хаки, однако, не должны иметь большого значения в вашем случае, так как вы ищете только изменение вTopItem.Вы захотите переопределить метод WndProc (), чтобы получить сообщение LVN_ENDSCROLL.Это работало хорошо, хотя я не проверял это полностью.Добавьте новый класс в свой проект и вставьте код ниже.Компиляция.Перетащите новый элемент управления из верхней части панели инструментов на форму.Реализуйте событие TopItemChanged.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class MyListView : ListView {
    public event EventHandler TopItemChanged;

    protected virtual void OnTopItemChanged(EventArgs e) {
        var handler = TopItemChanged;
        if (handler != null) handler(this, e);
    }

    protected override void WndProc(ref Message m) {
        // Trap LVN_ENDSCROLL, delivered with a WM_REFLECT + WM_NOTIFY message
        if (m.Msg == 0x204e) {
            var notify = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
            if (notify.code == -181 && !this.TopItem.Equals(lastTopItem)) {
                OnTopItemChanged(EventArgs.Empty);
                lastTopItem = this.TopItem;
            }
        }
        base.WndProc(ref m);
    }

    private ListViewItem lastTopItem = null;
    private struct NMHDR {
        public IntPtr hwndFrom;
        public IntPtr idFrom;
        public int code;
    }
}
1 голос
/ 09 января 2012

Нет события специально для свойства TopItem.Однако вы сможете получить тот же эффект, кэшируя предыдущий результат TopItem и сравнивая его с другими событиями, которые являются индикаторами переупорядочения элементов: например, Paint и DrawItem.

private void WatchTopItemChanged(ListView listView, Action callOnChanged) {
  var lastTopItem = listView.TopItem;
  listView.DrawItem += delegate {
    if (lastTopItem != listView.TopItem) {
      lastTopItem = listView.TopItem;
      callOnChanged();
    }
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...