以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]右滚动表格点单元后滚动回弹  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=186681)

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




--  作者:有点蓝
--  发布时间:2023/5/19 14:41:00
--  
先点一下单元格,再拖动滚动条
--  作者:zhutangxin
--  发布时间:2023/5/19 14:44:00
--  
是的,先点一下单元格后就没问题。这个动作可以用代码完成吗?很多用户没有这个习惯,他们在用Excel的习惯做。
用table().select(0,0) 不能解决这个问题。

--  作者:zhutangxin
--  发布时间:2023/5/19 14:45:00
--  
这个动作可以用代码完成吗?


--  作者:有点蓝
--  发布时间:2023/5/19 14:48:00
--  
没有办法。可以看做是一个无法解决的bug,暂时无法处理
--  作者:zhutangxin
--  发布时间:2023/5/19 15:06:00
--  
希望在下个版本中能解决这个问题
--  作者:zhutangxin
--  发布时间:2023/5/19 15:08:00
--  
其他狐友如遇到过这个问题并己解决的话,希望留言告诉解决方法,感激不尽
--  作者:zhutangxin
--  发布时间: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
--  发布时间: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
--  发布时间:2023/5/20 1:13:00
--  
问题解决了,在前述AI的帮助下,把注意力放到获得焦点上。一行代码的事。具体方法如下:

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

e.Table.Focus