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

CSDNFucker 2016-02-19 09:14:13
DataGridView(winform)在隐藏水平滚动条时,修改列宽或列显示顺序,都会自动跳到第一行
有没有办法让其固定在当前显示列
...全文
697 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
  • 打赏
  • 举报
回复
修改列宽或列显示顺序,列出你的修改方式
下载代码方式:https://pan.quark.cn/s/e2157c05e625 在信息技术领域中,数学问题的复杂求解在很大程度上依赖于数值计算,这在科学计算、工程分析以及数据分析等多个方面尤为重要。线性方程组的求解是数值计算中的一个核心且关键的问题,而雅克比迭代法作为一种有效策略,专门用于处理大规模稀疏线性方程组。这个资源提供了一段采用C++语言编写的雅克比迭代法源代码,配合附带的博客文章,能够帮助使用者深入掌握此方法的基本原理和实际应用。 雅克比迭代法,有也被称作局部迭代方法,主要用于求解形式为 Ax = b 的线性方程组,其中矩阵A需满足对角占优的条件。对角占优的特性是指矩阵中每个对角线元素的绝对值要大于该行其他元素绝对值之和,这一性质确保了算法的收敛性能。该方法的实施基于矩阵A的雅克比矩阵J,其构成方式为 J = D - L - U,其中D、L和U分别代表矩阵A的对角线部分、下三角部分以及上三角部分。 迭代过程的数学表达式为:x(k+1) = J^-1 * b + (I - J^-1*A) * x(k),在此表达式中,x(k)表示第k次迭代的解向量,x(k+1)则是第k+1次迭代的解向量,I是单位矩阵。每次迭代都利用前一次得到的解来计算下一次的解,迭代持续进行,直到解的精度达到预设标准或迭代次数达到最大限制。 在使用C++进行编程实现,主要步骤包括: 1. 初始化阶段:设定初始解向量x(0),并明确迭代过程中的参数,例如最大迭代次数和容许的误差界限。 2. 构建雅克比矩阵:依据矩阵A的非对角元素来形成J矩阵。 3. 迭代计算:依照上述迭代公式计算新的解向量,并验证是否满足终止条件(即当前解与前一次解的差值小于设定的误差界限)。 4. 结果输出...

8,832

社区成员

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

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