Search code examples
c#performancedatagridviewscrollmousewheel

DataGridView MouseWheel sendkeys updown issue


i create a subclass datagridview to override the mousewheel event to catch mouse scroll then send key UP or DOWN. i create a datatable to be bind as datasource for mydatagridview by button click

    private void button1_Click(object sender, EventArgs e)
    {
        DataTable myDataTable = new DataTable();

        int NUM_ROWS = 150;
        int NUM_COLS_TO_CREATE = 10;

        for (int i = 0; i < NUM_COLS_TO_CREATE; i++)
        {
            myDataTable.Columns.Add("x" + i, typeof(string));
        }

        for (int i = 0; i < NUM_ROWS; i++)
        {
            var theRow = myDataTable.NewRow();

            for (int j = 0; j < NUM_COLS_TO_CREATE; j++)
            {
                theRow[j] = "whatever";
            }

            //add the row *after* populating it
            myDataTable.Rows.Add(theRow);
        }

        MyDataGridView1.DataSource = myDataTable;
    }

the code that override the mousewheel event as this

public partial class MyDataGridView : DataGridView
{
    protected override void OnMouseWheel(MouseEventArgs e)
    {
        if (e.Delta < 0)
            SendKeys.Send("{DOWN}");
        else
            SendKeys.Send("{UP}");
    }
}

Its working fine if we use mouse wheel to scroll each item in a SLOW way, but if you scroll too FAST using the mouse wheel, somewhat the datagridview becomes lagging.

As example from row 1 to 5, it will jump the row from 1 to 3,then 3 to 5 something like that, here come another weird issue. i use "Navicat" a lot in my daily basis..

so if i open both my application and Navicat. the mouse wheel scrolling now become very smooth on my application even if i scroll too fast. but then if i close Navicat then scrolling become lagging again. what was causing this? i am very sorry if i cant explained it well, all i want is just want to makes the scrolling each item smooth. Any suggestion?


Solution

  • as @Bozhidar mentioned that i should better handling the MouseWheel event instead or overriding it. so i've come up with the solution just in case anyone need it too.

    in Form_Load add

    MyDataGridView1.MouseWheel += new MouseEventHandler(MyDataGridView1_MouseWheel);
    

    then place this anywhere inside your class

    private void MyDataGridView1_MouseWheel(object sender, MouseEventArgs e)
    {
        HandledMouseEventArgs hme = (HandledMouseEventArgs)e;
        hme.Handled = true;
    
        int rowIndex = MyDataGridView1.CurrentCell.RowIndex;
        int cellIndex = MyDataGridView1.CurrentCell.ColumnIndex;
    
        MyDataGridView1.CurrentCell = MyDataGridView1.Rows[e.Delta < 0 ? Math.Min(rowIndex + 1, MyDataGridView1.RowCount - 1) : Math.Max(rowIndex - 1, 0)].Cells[cellIndex];
    
    }