Frage

Ich habe versucht, diese ( http : //brainof-dave.blogspot.com/2007/08/turning-off-auto-scrolling-in-bound.html ) im „RowChanged“ Ereignisse auf der Datentabelle, die die Datenquelle für das Datagridview ist , aber ohne Erfolg.

Im Grunde habe ich eine Datagridview mit einer Binding wie es Datasource ist. Die Bindingdatasource ist ein Dataview, die eine Datentabelle enthält. Jedesmal, wenn Daten in einer der Zeilen ändert, werden die Datagridview scrollt nach oben zurück. Gibt es eine einfache Lösung für dieses?

War es hilfreich?

Lösung

Sieht aus wie ich fand es: http: / /seewinapp.blogspot.com/2005/09/is-your-autoscroll-too-auto.html

overrode ich das RowChanged Ereignis auf dem Datatable, die FirstDisplayedScrollingRowIndex gespeichert sind, aufgerufen, um eine delegierte Methode mit diesem Index als Argument, und dann die FirstDisplayedScrollingRowIndex innerhalb des Delegatmethode auf dieses Argument zurück. Es stellt sich heraus, dass auto-scroll erst auftritt, nachdem alle Ereignisse ausgelöst haben, so dass es nutzlos ist, zu versuchen, es in einem Fall zu hacken. Der Delegierte funktioniert, weil es nach den Ereignissen aufgerufen wird.

Andere Tipps

Hier wird getestet Code, der die RowIndex nach Änderung der Datenquelle wieder her. Dies stellt auch die Sortierreihenfolge und die letzte Zelle Position. Sprache: C # 7.0. Dies ist Code, den ich schrieb persönlich, mit etwas Hilfe von Web-Recherchen.

    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);
        }
    } 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top