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

CSDNFucker 2016-02-19 09:14:13
DataGridView(winform)在隐藏水平滚动条时,修改列宽或列显示顺序,都会自动跳到第一行
有没有办法让其固定在当前显示列
...全文
661 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDNFucker 2016-02-19
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?
按上面的代码已经解决问题了 原代码地址 http://www.codeproject.com/Articles/51889/Summary-DataGridView 但这份代码有我所讲的问题,加上上面的代码就可以解决了:)
xdashewan 2016-02-19
  • 打赏
  • 举报
回复
引用 6 楼 CSDNFucker 的回复:
感谢关注,能否贴出重绘的事件及处理代码。
重绘是系统执行,不知代码。能否给出一个简单的form代码用于试验?
CSDNFucker 2016-02-19
  • 打赏
  • 举报
回复
引用 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();
                    }
                }
            };
xdashewan 2016-02-19
  • 打赏
  • 举报
回复
引用 4 楼 CSDNFucker 的回复:
谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列 获取的FirstDisplayedScrollingColumnIndex也是0的。 在Scroll事件可以捕获到Grid会从当前位置滚到0 我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll
从我的一个干净的dataGridView试验发现,dataGridView2.ScrollBars = ScrollBars.Vertical;调整ScrollBars的滚动条样式会导致dataGridView回滚到第一行,期间很可能发生了dataGridView重绘。那么第一行index的目的其实就是在重绘发生前先记录下当前位置,以便在重绘后复原到该位置,我在干净的dataGridView实测是可以得。但你的dataGridView可能受到你写的其他事件或代码的影响,没有呈现出一个干净的dataGridView在调整ScrollBars的滚动条样式立即就回到第一条的现象,所以只凭目前这点描述很难分析
CSDNFucker 2016-02-19
  • 打赏
  • 举报
回复
引用 3 楼 xdashewan 的回复:

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;
谢谢你的回复,这不行,主要是拖动列时HScrollBar是隐藏的,Grid会滚动到第一列 获取的FirstDisplayedScrollingColumnIndex也是0的。 在Scroll事件可以捕获到Grid会从当前位置滚到0 我正在想办法取消这种由修改列宽所引起的Scroll但不影响正常Scroll
xdashewan 2016-02-19
  • 打赏
  • 举报
回复
引用 2 楼 CSDNFucker 的回复:
dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后 鼠标拖动修改列宽,就会自动滚到第一列
试试

int index = dataGridView2.FirstDisplayedScrollingRowIndex;
dataGridView2.ScrollBars = ScrollBars.Vertical;
dataGridView2.FirstDisplayedScrollingRowIndex = index;
CSDNFucker 2016-02-19
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
修改列宽或列显示顺序,列出你的修改方式
dgv.ScrollBars = ScrollBars.Vertical; // 把dataGridView的水平滚动条隐藏后 鼠标拖动修改列宽,就会自动滚到第一列
xdashewan 2016-02-19
  • 打赏
  • 举报
回复
修改列宽或列显示顺序,列出你的修改方式

8,833

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧