Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagridview FirstDisplayedScrollingRowIndex在网格底部不工作_C#_Winforms_Datagridview - Fatal编程技术网

C# Datagridview FirstDisplayedScrollingRowIndex在网格底部不工作

C# Datagridview FirstDisplayedScrollingRowIndex在网格底部不工作,c#,winforms,datagridview,C#,Winforms,Datagridview,对于滚动datagrid,我使用以下代码: dataGridView1.FirstDisplayedScrollingRowIndex = currentRowIndexInGridView; dataGridView1.Update(); 这适用于不在网格底部的行。 如果我将其用于底部行,则在调试期间检查时,setter不会将其设置为我想要的值。 例如,我将FirstDisplayedScrollingRowIndex设置为103,但在分配FirstDisplayedScrollingRow

对于滚动datagrid,我使用以下代码:

dataGridView1.FirstDisplayedScrollingRowIndex = currentRowIndexInGridView;
dataGridView1.Update();
这适用于不在网格底部的行。 如果我将其用于底部行,则在调试期间检查时,setter不会将其设置为我想要的值。 例如,我将FirstDisplayedScrollingRowIndex设置为103,但在分配FirstDisplayedScrollingRowIndex后,其值为90,因此所需的行不可见。 从某个点开始,它停止滚动,我看不到最后5行。 如果我添加新行并将它们设置为显示,它会滚动一行,但我不会再看到最后5行

我认为这与事实有关,我的一些行具有不同的高度,并且显示的rowcount的一些内部估计失败

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

编辑:

FirstDisplayedScrollingRowIndex设置器的重要部分在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变量时似乎有错误。

每当添加新行时,调用下面的方法

    private void Autoscroll()
    {            

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

    }
private void Autoscroll()
{            
if(dgv.FirstDisplayedScrollingRowIndex+dgv.DisplayedRowCount(false)
我必须强制所有行具有相同的宽度,否则

FirstDisplayedScrollingRowIndex

塞特车有问题。

我有类似的问题,但我找到了解决方法。 问题是DataGridView需要windows窗体刷新,只有在刷新之后才能将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();
}

同时设置
CurrentCell
怎么样?也许这会有帮助。没有任何更改,我仍然看不到最后5行。您是如何配置网格以具有不同高度的行的?即使我允许调整行高以适应其上下文(因此有许多行具有不同的高度),FirstDisplayScrollingRow也能正常工作。因为FirstDisplayedScrollingRowIndex的设置器在我的情况下被破坏了,不是所有行都具有相同的高度,这并不能解决问题。我的问题也发生在不添加新行的情况下,即使我只处理现有的行,我也必须添加
&&dgv.rows.Count!=1
到第一个if条件,则它工作正常。