Datagridview FirstDisplayedScrollingRowIndex不在网格底部工作

时间:2012-03-22 10:18:09

标签: c# winforms datagridview

为了滚动数据网格,我使用以下代码:

dataGridView1.FirstDisplayedScrollingRowIndex = currentRowIndexInGridView;
dataGridView1.Update();

对于不在网格底部的行,它可以正常工作。 如果我将它用于底行,那么当我在调试期间检查它时,setter不会将其设置为我想要的值。 例如。我设置FirstDisplayedScrollingRowIndex = 103,但在赋值后,FirstDisplayedScrollingRowIndex的值为90,因此所需的行不可见。 从某一点开始它停止滚动,我看不到最后5行。 如果我要添加新行并将它们设置为显示,它会滚动一个,但我再也看不到最后5行了。

我认为这与事实有关,我的一些行有不同的高度,而且一些内部情况的DisplayedRowCount失败了???

有没有办法检测这种情况,然后强制滚动到数据网格的底部?

编辑:

FirstDisplayedScrollingRowIndex setter的重要部分在Reflector中如下所示:

 if (value > this.displayedBandsInfo.FirstDisplayedScrollingRow)
        {
            int rows = this.Rows.GetRowCount(DataGridViewElementStates.Visible, this.displayedBandsInfo.FirstDisplayedScrollingRow, value);
            this.ScrollRowsByCount(rows, (rows > 1) ? ScrollEventType.LargeIncrement : ScrollEventType.SmallIncrement);
        }
        else
        {
            this.ScrollRowIntoView(-1, value, true, false);
        }

计算rows变量时似乎有错误。

3 个答案:

答案 0 :(得分:2)

每当添加新行时,请调用以下方法

    private void Autoscroll()
    {            

        if (dgv.FirstDisplayedScrollingRowIndex + dgv.DisplayedRowCount(false) < dgv.Rows.Count)
        {
            dgv.FirstDisplayedScrollingRowIndex += dgv.DisplayedRowCount(false);
        }
        else
        {
            dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1;
        }

    }

答案 1 :(得分:2)

我必须强制所有行具有相同的宽度,否则

FirstDisplayedScrollingRowIndex

setter是错误的。

答案 2 :(得分:0)

我有类似的问题,但是我找到了解决方法。 问题似乎是DataGridView要求刷新窗口窗体,只有在此之后才能将FirstDisplayedScrollingRowIndex设置为新索引。 我做了什么?

Timer refreshTimer = new Timer();
public void RefreshLog()
{
    dataGridViewVesselLog.DataSource = Log.Items;
    dataGridViewVesselLog.Update();
    dataGridViewVesselLog.Refresh();
    refreshTimer.Interval = 100;
    refreshTimer.Tick += (s, e) =>
    {
        if (dataGridViewVesselLog.Rows.Count > 0)
        {
            foreach (DataGridViewRow r in dataGridViewVesselLog.SelectedRows) 
                r.Selected = false;
            dataGridViewVesselLog.Rows[dataGridViewVesselLog.Rows.Count - 1].Selected = true;
            dataGridViewVesselLog.FirstDisplayedScrollingRowIndex = (int)(dataGridViewVesselLog.Rows.Count - 1);

        }
        refreshTimer.Stop();
    }
    refreshTimer.Start();
}