Как можно заставить DataGridView прокрутить один объект во время с помощью колеса мыши?

Document.write создает разметку HTML, а не простой текст. В HTML новая строка представлена ​​элементом <br/>. Если бы вы писали в консоль браузера, вы бы не создавали разметку HTML, поэтому символ новой строки "\ n" будет уместным.

7
задан Ken Wootton 25 September 2008 в 20:50
поделиться

4 ответа

Я просто сделал немного попрашайничества и моего собственного тестирования. Я использовал Отражатель для исследования и обнаружил пару вещей. MouseWheel событие обеспечивает a MouseEventArgs параметр, но OnMouseWheel() переопределение в DataGridView броски это к HandledMouseEventArgs. Это также работает при обработке MouseWheel событие. OnMouseWheel() действительно становится названным, и это находится в DataGridViewпереопределение, которое это использует SystemInformation.MouseWheelScrollLines.

Так:

  1. Вы могли действительно обработать MouseWheel событие, бросая MouseEventArgs кому: HandledMouseEventArgs и набор Handled = true, затем сделайте то, что Вы хотите.

  2. Подкласс DataGridView, переопределение OnMouseWheel() самостоятельно, и попытка воссоздать весь код я читал здесь в Отражателе за исключением замены SystemInformation.MouseWheelScrollLines с 1.

Последний был бы огромной болью, потому что она использует много частных переменных (включая ссылки на ScrollBars) и Вы имели бы замену некоторыми с Вашим собственным и получили бы/установили бы других, использующих Отражение.

4
ответ дан 7 December 2019 в 07:52
поделиться

Я разделил бы DataGridView на подклассы в свое собственное управление (Вы знаете, добавляете новые Windows Forms-> файл Пользовательского элемента управления и изменяете базовый класс от Управления до DataGridView).

public partial class MyDataGridView : DataGridView

Затем переопределите метод WndProc и замените чем-то как так:

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x20a)
    {
        int wheelDelta = ((int)m.WParam) >> 16;

        // 120 = UP 1 tick
        // -120 = DOWN 1 tick

        this.FirstDisplayedScrollingRowIndex -= (wheelDelta / 120);
    }
    else
    {
        base.WndProc(ref m);
    }
}

Конечно, у Вас будет проверка, что Вы не устанавливаете FirstDisplayedScrollingRowIndex на число за пределами диапазона Вашей сетки и т.д. Но это работает вполне хорошо!

Richard

1
ответ дан 7 December 2019 в 07:52
поделиться

ОБНОВЛЕНИЕ: Так как я теперь узнал что DataGridView имеет a MouseWheel событие, я добавил второе, более простое переопределение.

Один способ выполнить это состоит в том, чтобы разделить на подклассы DataGridView и переопределение WndProc добавить специальную обработку WM_MOUSEWHEEL сообщение.

Этот пример ловит перемещение колеса мыши и заменяет его вызовом к SendKeys.Send.

(Это немного отличается, чем просто прокрутка, так как она также выбирает следующую/предыдущую строку DataGridView. Но это работает.)

public class MyDataGridView : DataGridView
{
    private const uint WM_MOUSEWHEEL = 0x20a;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEWHEEL)
        {
            var wheelDelta = ((int)m.WParam) >> 16;

            if (wheelDelta < 0)
            {
                SendKeys.Send("{DOWN}");
            }

            if (wheelDelta > 0)
            {
                SendKeys.Send("{UP}");
            }

            return;
        }

        base.WndProc(ref m);
    }
}

2-е взятие (с теми же протестами, как упомянуто выше):

public class MyDataGridView : DataGridView
{
    protected override void OnMouseWheel(MouseEventArgs e)
    {
        if (e.Delta < 0)
            SendKeys.Send("{DOWN}");
        else
            SendKeys.Send("{UP}");
    }
}
1
ответ дан 7 December 2019 в 07:52
поделиться

Переопределяя OnMouseWheel и не называя основу. OnMouseWheel должен работать. Некоторые мыши колеса имеют специальные настройки, которые Вы, возможно, должны установить сами, чтобы это работало правильно. См. это сообщение http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=126295&SiteID=1

1
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: