C# 与使用DataGridView的excel类似的水平滚动

C# 与使用DataGridView的excel类似的水平滚动,c#,datagridview,C#,Datagridview,DataGridView可以在交错区域(类似于excel)中水平滚动 我不需要沿着列单元格滚动(连续),而是当滚动到达单元格边界时,网格应该滚动下一列单元格。尝试使用FirstDisplayedScrollingColumnIndex属性。应该有帮助。如果要设置FirstDisplayedScrollingColumnIndex,则跳到指定列索引的开头 比如: protected override void OnScroll(ScrollEventArgs e) { base.OnScr

DataGridView可以在交错区域(类似于excel)中水平滚动


我不需要沿着列单元格滚动(连续),而是当滚动到达单元格边界时,网格应该滚动下一列单元格。

尝试使用FirstDisplayedScrollingColumnIndex属性。应该有帮助。如果要设置FirstDisplayedScrollingColumnIndex,则跳到指定列索引的开头

比如:

protected override void OnScroll(ScrollEventArgs e) {
    base.OnScroll(e);
    this.FirstDisplayedScrollingColumnIndex = Convert.ToInt32(this.HorizontalScrollBar.Value / this.Width); }

可以替代OnScroll方法并计算下一个偏移

    protected override void OnScroll(ScrollEventArgs e)
    {
        if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
        {
            e.NewValue = GetColumnOffset(e.NewValue);;
        }
        base.OnScroll(e);
    }

    private int GetColumnOffset(int offset)
    {
        int start = 0, end = 0;
        foreach (var column in Columns.Cast<DataGridViewColumn>().Where(c=>!c.Frozen))
        {
            end = start + column.Width;
            if (start <= offset && offset < end)
            {
                break;
            }
            start = end;
        }
        return start == offset ? offset : end;
    }
protected override void OnScroll(ScrollEventArgs e)
{
if(e.ScrollOrientation==ScrollOrientation.HorizontalScroll)
{
e、 NewValue=GetColumnOffset(例如NewValue);;
}
base.OnScroll(e);
}
私有整型GetColumnCoffset(整型偏移)
{
int start=0,end=0;
foreach(Columns.Cast()中的var列,其中(c=>!c.freezed))
{
结束=开始+列宽;
如果(开始)