C# DatagridView水平滚动可滚动出精确宽度的列,不应从中间切断

C# DatagridView水平滚动可滚动出精确宽度的列,不应从中间切断,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个DataGridview。它有一个dgv_滚动事件。在水平滚动中(在移动滚动条时),我需要它正好与列的宽度齐平。就像我们单击Datagridview滚动条的末端箭头(都在右端和左端)时一样。在Datagridview滚动事件中添加此项 if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) { e.NewValue = GetColumnOffset(e.NewValue); } 然后定义方法 privat

我有一个DataGridview。它有一个dgv_滚动事件。在水平滚动中(在移动滚动条时),我需要它正好与列的宽度齐平。就像我们单击Datagridview滚动条的末端箭头(都在右端和左端)时一样。

在Datagridview滚动事件中添加此项

if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
{
    e.NewValue = GetColumnOffset(e.NewValue); 
}
然后定义方法

private int GetColumnOffset(int offset)
{
    int start = 0, end = 0;
    DataGridViewColumnCollection Columns = dgvBudgetPeriods.Columns;
    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;
}
private int getColumnCoffset(int offset)
{
int start=0,end=0;
DataGridViewColumnCollection Columns=dgvBudgetPeriods.Columns;
foreach(Columns.Cast()中的var列,其中(c=>!c.freezed))
{
结束=开始+列宽;
如果(开始)