Comment puis-je prévenir un DataGridView de défilement automatique lorsque les changements de source de données?

StackOverflow https://stackoverflow.com/questions/1521396

  •  19-09-2019
  •  | 
  •  

Question

J'ai essayé ( http : //brainof-dave.blogspot.com/2007/08/turning-off-auto-scrolling-in-bound.html) en cas « RowChanged » sur le DataTable qui est la source de données pour le DataGridView , mais en vain.

En fait, j'ai un DataGridView avec un BindingSource comme il est DataSource. Le DataSource BindingSource est un DataView qui contient un DataTable. Toutes les données de temps dans l'un des changements de lignes, les rouleaux DataGridView arrière vers le haut. Y at-il une solution simple pour cela?

Était-ce utile?

La solution

On dirait que je l'ai trouvé: http: / /seewinapp.blogspot.com/2005/09/is-your-autoscroll-too-auto.html

I passé outre l'événement RowChanged sur le DataTable, stocké le FirstDisplayedScrollingRowIndex, invoqué une méthode déléguée avec cet indice comme argument, puis réinitialiser le FirstDisplayedScrollingRowIndex à cet argument dans la méthode de délégué. Il se trouve que le défilement automatique ne se produit qu'après tous les événements ont été tirés, il est donc inutile d'essayer de pirater l'intérieur d'un événement. Le délégué fonctionne parce qu'il est invoqué après les événements.

Autres conseils

code est testé ici qui restaure l'RowIndex après avoir changé la source de données. Cela rétablit également l'ordre de tri et la dernière position de la cellule. Langue: C # 7.0. Ceci est du code que j'ai écrit personnellement, avec l'aide de recherches sur le Web.

    private void UpdateDataSource()
    {
        SuspendLayout();

        //Save last position and sort order
        DataGridView g = DataGridView1;
        Int32 idxFirstDisplayedScrollingRow = g.FirstDisplayedScrollingRowIndex;
        SortOrder dgvLastSortDirection = g.SortOrder;
        Int32 lastSortColumnPos = g.SortedColumn?.Index ?? -1;
        Int32 dgvLastCellRow = g.CurrentCell?.RowIndex ?? -1;
        Int32 dgvLastCellColumn = g.CurrentCell?.ColumnIndex ?? -1;

        //Set new datasource
        g.DataSource = myNewDataTableSource;                                                                     

        //Restore sort order, scroll row, and active cell
        g.InvokeIfRequired( o =>
        {
            if(lastSortColumnPos > -1)
            {
                DataGridViewColumn newColumn = o.Columns[lastSortColumnPos];
                switch(dgvLastSortDirection)
                {
                    case SortOrder.Ascending:
                        o.Sort(newColumn, ListSortDirection.Ascending);
                        break;
                    case SortOrder.Descending:
                        o.Sort(newColumn, ListSortDirection.Descending);
                        break;
                    case SortOrder.None:
                        //No sort
                        break;
                }
            }

            if(idxFirstDisplayedScrollingRow >= 0)
                o.FirstDisplayedScrollingRowIndex = idxFirstDisplayedScrollingRow;

            if(dgvLastCellRow>-1 && dgvLastCellColumn>-1)
                o.CurrentCell = g[dgvLastCellColumn, dgvLastCellRow];
        } );

        ResumeLayout();
    }

    public static void InvokeIfRequired<T>(this T obj, InvokeIfRequiredDelegate<T> action) where T : ISynchronizeInvoke
    {
        if (obj.InvokeRequired)
        {
            obj.Invoke(action, new Object[] { obj });
        }
        else
        {
            action(obj);
        }
    } 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top