Foxtable(狐表)用户栏目专家坐堂 → [求助]右滚动表格点单元后滚动回弹


  共有3962人关注过本帖树形打印复制链接

主题:[求助]右滚动表格点单元后滚动回弹

帅哥哟,离线,有人找我吗?
zhutangxin
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
[求助]右滚动表格点单元后滚动回弹  发帖心情 Post By:2023/5/19 14:36:00 [显示全部帖子]

如附件GIF所示,上面的表格字段比较多,刚打开窗口时,希望编辑靠右的字段,拖动左右滚动条到最右侧,然后鼠标点在一个单元格,此时滚动条又回到了最左侧,再拖动左右滚动条到最右侧,就没有问题了。不知道这个问题怎么解决。
图片点击可在新窗口打开查看此主题相关图片如下:gif 2023-5-19 14-23-25.gif
图片点击可在新窗口打开查看




 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 14:44:00 [显示全部帖子]

是的,先点一下单元格后就没问题。这个动作可以用代码完成吗?很多用户没有这个习惯,他们在用Excel的习惯做。
用table().select(0,0) 不能解决这个问题。

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 14:45:00 [显示全部帖子]

这个动作可以用代码完成吗?


 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 15:06:00 [显示全部帖子]

希望在下个版本中能解决这个问题

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 15:08:00 [显示全部帖子]

其他狐友如遇到过这个问题并己解决的话,希望留言告诉解决方法,感激不尽

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 23:37:00 [显示全部帖子]

用 ChatGPT 问这个问题,它给出了思路,不知道对“有点蓝”老师是否有帮助?

问:

图片点击可在新窗口打开查看此主题相关图片如下:snipaste_2023-05-19_23-36-22.jpg
图片点击可在新窗口打开查看

用component oner控件Table做的Winform程序,表格字段比较多,刚打开窗口时,希望编辑靠右的字段,拖动左右滚动条到最右侧,然后鼠标点在一个单元格,此时滚动条又回到了最左侧,再拖动左右滚动条到最右侧,就没有问题了。不知道这个问题怎么解决?

答:

这个问题是因为当你点击一个单元格时,焦点会自动跳转到该单元格,而Table控件的默认行为是将焦点所在的单元格置于可见区域内,如果该单元格不在可见区域内,则会自动滚动到该单元格位置。因此,你需要通过以下步骤来解决这个问题: 1.在表格加载时设置默认的焦点单元格,使它靠右对齐,可以使用Table控件的DefaultCellStyle属性来设置该单元格的格式,并将该单元格的列索引指定为默认焦点列。 2.使用Table控件的CellMouseClick事件处理程序来捕获单元格点击事件。在该事件处理程序中,如果当前焦点单元格不是默认焦点单元格,则将滚动条位置重置到最右侧,以确保该单元格在可见区域内。你可以使用Table控件的HorizontalScrollbar属性来实现滚动条的操作。 3.最后,你还需要处理Table控件的SizeChanged事件,以确保表格大小发生变化时焦点单元格仍然可见。在该事件处理程序中,你可以使用Table控件的HorizontalScrollbarMaximum属性来获取当前滚动条的最大值,并根据此值来调整滚动条位置。 通过这些步骤,你就可以解决这个问题了。

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/19 23:44:00 [显示全部帖子]

同样的问题问 Claude,答复如下


图片点击可在新窗口打开查看此主题相关图片如下:snipaste_2023-05-19_23-43-08.jpg
图片点击可在新窗口打开查看


这个问题是因为当你点击一个单元格时,焦点会自动跳转到该单元格,而Table控件的默认行为是将焦点所在的单元格置于可见区域内,如果该单元格不在可见区域内,则会自动滚动到该单元格位置。因此,你需要通过以下步骤来解决这个问题:

1.在表格加载时设置默认的焦点单元格,使它靠右对齐,可以使用Table控件的DefaultCellStyle属性来设置该单元格的格式,并将该单元格的列索引指定为默认焦点列。
2.使用Table控件的CellMouseClick事件处理程序来捕获单元格点击事件。在该事件处理程序中,如果当前焦点单元格不是默认焦点单元格,则将滚动条位置重置到最右侧,以确保该单元格在可见区域内。你可以使用Table控件的HorizontalScrollbar属性来实现滚动条的操作。
3.最后,你还需要处理Table控件的SizeChanged事件,以确保表格大小发生变化时焦点单元格仍然可见。在该事件处理程序中,你可以使用Table控件的HorizontalScrollbarMaximum属性来获取当前滚动条的最大值,并根据此值来调整滚动条位置。
通过这些步骤,你就可以解决这个问题了。

这个问题是 WinForm 程序中 Table 控件的一个已知问题。原因是 Table 控件在初始打开窗口时,会自动滚动到第一行第一列,导致滚动条位置改变。
有两种解决方案:
1. 在表格加载完成后手动滚动到需要编辑的单元格区域。代码如下:
csharp
table.DataSource = yourDataSource;  // 加载数据源
// 滚动到需要编辑的单元格区域
table.FirstDisplayedScrollingRowIndex = 需编辑的行索引; 
table.FirstDisplayedScrollingColumnIndex = 需编辑的列索引;
2. 处理 Table 的 Scroll 事件,在事件中判断如果滚动是程序自动触发的,则忽略;如果是用户手动滚动,则正常滚动。代码如下:
csharp
bool isAutoScroll = true;  // 标记滚动是否自动触发

table.Scroll += (sender, e) => 
{
    if (isAutoScroll)  // 如果是自动触发的滚动,忽略
    {
        isAutoScroll = false;    
        return;
    }
    // 否则正常滚动  
    table.FirstDisplayedScrollingRowIndex = e.NewValue;
    table.FirstDisplayedScrollingColumnIndex = e.NewValue; 
};

// 加载数据源后标记滚动为手动触发
table.DataSource = yourDataSource;  
isAutoScroll = false;
这两种方法可以解决 Table 控件在初始化加载数据后自动滚动带来的问题,让用户可以直接滚动到需要编辑的单元格区域。
详细的示例代码我上传在这里:https://github.com/CharonChui/WinFormSamples/tree/master/TableAutoScrollDemo
你可以下载参考,或者直接在自己的项目中调用。如果仍有其他问题,欢迎提出来继续讨论。



 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:465 积分:3983 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2023/5/20 1:13:00 [显示全部帖子]

问题解决了,在前述AI的帮助下,把注意力放到获得焦点上。一行代码的事。具体方法如下:

在 AfterScroll 事件中设置如下代码:

e.Table.Focus

 回到顶部