DataGridView(winform)在隐藏水平滚动条时,修改列宽或列显示顺序,都会自动跳到第一行

时间:2021-04-04 23:12:30
DataGridView(winform)在隐藏水平滚动条时,修改列宽或列显示顺序,都会自动跳到第一行
有没有办法让其固定在当前显示列

8 个解决方案

#1


修改列宽或列显示顺序,列出你的修改方式

#2


引用 1 楼 xdashewan 的回复:
修改列宽或列显示顺序,列出你的修改方式


dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后
鼠标拖动修改列宽,就会自动滚到第一列

#3


引用 2 楼 CSDNFucker 的回复:
dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后
鼠标拖动修改列宽,就会自动滚到第一列

试试

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;

#4


引用 3 楼 xdashewan 的回复:

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;


谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列
获取的FirstDisplayedScrollingColumnIndex也是0的。
在Scroll事件可以捕获到Grid会从当前位置滚到0
我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll

#5


引用 4 楼 CSDNFucker 的回复:
谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列
获取的FirstDisplayedScrollingColumnIndex也是0的。
在Scroll事件可以捕获到Grid会从当前位置滚到0
我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll

从我的一个干净的dataGridView试验发现,dataGridView2.ScrollBars = ScrollBars.Vertical;调整ScrollBars的滚动条样式会导致dataGridView回滚到第一行,期间很可能发生了dataGridView重绘。那么第一行index的目的其实就是在重绘发生前先记录下当前位置,以便在重绘后复原到该位置,我在干净的dataGridView实测是可以得。但你的dataGridView可能受到你写的其他事件或代码的影响,没有呈现出一个干净的dataGridView在调整ScrollBars的滚动条样式立即就回到第一条的现象,所以只凭目前这点描述很难分析

#6


引用 5 楼 xdashewan 的回复:
从我的一个干净的dataGridView试验发现,dataGridView2.ScrollBars = ScrollBars.Vertical;调整ScrollBars的滚动条样式会导致dataGridView回滚到第一行,期间很可能发生了dataGridView重绘。那么第一行index的目的其实就是在重绘发生前先记录下当前位置,以便在重绘后复原到该位置,我在干净的dataGridView实测是可以得。但你的dataGridView可能受到你写的其他事件或代码的影响,没有呈现出一个干净的dataGridView在调整ScrollBars的滚动条样式立即就回到第一条的现象,所以只凭目前这点描述很难分析

感谢关注,能否贴出重绘的事件及处理代码。
我现在的做法是这样的:

            Scroll += (sender, e) =>
            {
                if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll
                    && e.NewValue >= 0)
                {
                    if (e.NewValue == 0)
                    {
                        var canScroll = !watch.IsRunning || watch.ElapsedMilliseconds > 200;
                        if (!canScroll)
                        {
                            e.NewValue = e.OldValue;
                        }                    
                    }
                    hScrollBar.Value = e.NewValue;
                }
            };

            MouseUp += (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (e.Location.Y <= ColumnHeadersHeight)
                    {
                        watch.Reset();
                        watch.Start();
                    }
                }
            };
            MouseClick += (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (e.Location.Y <= ColumnHeadersHeight)
                    {
                        watch.Reset();
                        watch.Start();
                    }
                }
            };

#7


引用 6 楼 CSDNFucker 的回复:
感谢关注,能否贴出重绘的事件及处理代码。

重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?

#8


引用 7 楼 xdashewan 的回复:
重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?

按上面的代码已经解决问题了
原代码地址
http://www.codeproject.com/Articles/51889/Summary-DataGridView
但这份代码有我所讲的问题,加上上面的代码就可以解决了:)

#1


修改列宽或列显示顺序,列出你的修改方式

#2


引用 1 楼 xdashewan 的回复:
修改列宽或列显示顺序,列出你的修改方式


dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后
鼠标拖动修改列宽,就会自动滚到第一列

#3


引用 2 楼 CSDNFucker 的回复:
dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后
鼠标拖动修改列宽,就会自动滚到第一列

试试

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;

#4


引用 3 楼 xdashewan 的回复:

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;


谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列
获取的FirstDisplayedScrollingColumnIndex也是0的。
在Scroll事件可以捕获到Grid会从当前位置滚到0
我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll

#5


引用 4 楼 CSDNFucker 的回复:
谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列
获取的FirstDisplayedScrollingColumnIndex也是0的。
在Scroll事件可以捕获到Grid会从当前位置滚到0
我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll

从我的一个干净的dataGridView试验发现,dataGridView2.ScrollBars = ScrollBars.Vertical;调整ScrollBars的滚动条样式会导致dataGridView回滚到第一行,期间很可能发生了dataGridView重绘。那么第一行index的目的其实就是在重绘发生前先记录下当前位置,以便在重绘后复原到该位置,我在干净的dataGridView实测是可以得。但你的dataGridView可能受到你写的其他事件或代码的影响,没有呈现出一个干净的dataGridView在调整ScrollBars的滚动条样式立即就回到第一条的现象,所以只凭目前这点描述很难分析

#6


引用 5 楼 xdashewan 的回复:
从我的一个干净的dataGridView试验发现,dataGridView2.ScrollBars = ScrollBars.Vertical;调整ScrollBars的滚动条样式会导致dataGridView回滚到第一行,期间很可能发生了dataGridView重绘。那么第一行index的目的其实就是在重绘发生前先记录下当前位置,以便在重绘后复原到该位置,我在干净的dataGridView实测是可以得。但你的dataGridView可能受到你写的其他事件或代码的影响,没有呈现出一个干净的dataGridView在调整ScrollBars的滚动条样式立即就回到第一条的现象,所以只凭目前这点描述很难分析

感谢关注,能否贴出重绘的事件及处理代码。
我现在的做法是这样的:

            Scroll += (sender, e) =>
            {
                if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll
                    && e.NewValue >= 0)
                {
                    if (e.NewValue == 0)
                    {
                        var canScroll = !watch.IsRunning || watch.ElapsedMilliseconds > 200;
                        if (!canScroll)
                        {
                            e.NewValue = e.OldValue;
                        }                    
                    }
                    hScrollBar.Value = e.NewValue;
                }
            };

            MouseUp += (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (e.Location.Y <= ColumnHeadersHeight)
                    {
                        watch.Reset();
                        watch.Start();
                    }
                }
            };
            MouseClick += (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (e.Location.Y <= ColumnHeadersHeight)
                    {
                        watch.Reset();
                        watch.Start();
                    }
                }
            };

#7


引用 6 楼 CSDNFucker 的回复:
感谢关注,能否贴出重绘的事件及处理代码。

重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?

#8


引用 7 楼 xdashewan 的回复:
重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?

按上面的代码已经解决问题了
原代码地址
http://www.codeproject.com/Articles/51889/Summary-DataGridView
但这份代码有我所讲的问题,加上上面的代码就可以解决了:)