C#DataGridView无法立即在HScroll之后重新定位列

C#DataGridView无法立即在HScroll之后重新定位列,c#,winforms,datagridview,C#,Winforms,Datagridview,C#DataGridView无法立即在HScroll之后重新定位列。 如上所述,有什么解决办法吗?我认为这是一个错误。 我已经查看了下面DataGridView的源代码,我发现在我滚动之后它并没有转到“BeginColumnRelocation” protected virtual void OnCellMouseMove(DataGridViewCellMouseEventArgs e) { if (e.ColumnIndex >=

C#DataGridView无法立即在HScroll之后重新定位列。 如上所述,有什么解决办法吗?我认为这是一个错误。 我已经查看了下面DataGridView的源代码,我发现在我滚动之后它并没有转到“BeginColumnRelocation”

        protected virtual void OnCellMouseMove(DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex >= this.Columns.Count)
            {
                throw new ArgumentOutOfRangeException("e.ColumnIndex");
            }
            if (e.RowIndex >= this.Rows.Count)
            {
                throw new ArgumentOutOfRangeException("e.RowIndex");
            }
            DataGridViewCell dataGridViewCell = GetCellInternal(e.ColumnIndex, e.RowIndex);
            Debug.Assert(dataGridViewCell != null);
            if (e.RowIndex >= 0 && dataGridViewCell.MouseMoveUnsharesRowInternal(e))
            {
                DataGridViewRow dataGridViewRow = this.Rows[e.RowIndex];
                GetCellInternal(e.ColumnIndex, e.RowIndex).OnMouseMoveInternal(e);
            }
            else
            {
                dataGridViewCell.OnMouseMoveInternal(e);
            }

            DataGridViewCellMouseEventHandler eh = this.Events[EVENT_DATAGRIDVIEWCELLMOUSEMOVE] as DataGridViewCellMouseEventHandler;
            if (eh != null && !this.dataGridViewOper[DATAGRIDVIEWOPER_inDispose] && !this.IsDisposed)
            {
                eh(this, e);
            }

            if (!this.dataGridViewState1[DATAGRIDVIEWSTATE1_scrolledSinceMouseDown] &&
                !this.dataGridViewOper[DATAGRIDVIEWOPER_trackColResize] &&
                !this.dataGridViewOper[DATAGRIDVIEWOPER_trackRowResize] &&
                !this.dataGridViewOper[DATAGRIDVIEWOPER_trackColRelocation] &&
                !this.dataGridViewOper[DATAGRIDVIEWOPER_trackColHeadersResize] &&
                !this.dataGridViewOper[DATAGRIDVIEWOPER_trackRowHeadersResize] &&
                this.AllowUserToOrderColumns &&
                this.SelectionMode != DataGridViewSelectionMode.FullColumnSelect &&
                this.SelectionMode != DataGridViewSelectionMode.ColumnHeaderSelect &&
                e.Button == MouseButtons.Left &&
                this.ptMouseDownCell.Y == -1 &&
                this.ptMouseDownCell.X >= 0 &&
                this.ptMouseDownCell.X < this.Columns.Count)
            {
                Point ptGridCoord = ConvertCellToGridCoord(e.ColumnIndex, e.RowIndex, e.X, e.Y);

                HitTestInfo hti = HitTest(ptGridCoord.X, ptGridCoord.Y);

                Debug.Assert(hti.Type != DataGridViewHitTestType.None &&
                             hti.Type != DataGridViewHitTestType.HorizontalScrollBar &&
                             hti.Type != DataGridViewHitTestType.VerticalScrollBar);

                switch (hti.typeInternal)
                {
                    // Check for column header mouse down
                    case DataGridViewHitTestTypeInternal.ColumnHeader:
                    case DataGridViewHitTestTypeInternal.ColumnHeaderLeft:
                    case DataGridViewHitTestTypeInternal.ColumnHeaderRight:
                    case DataGridViewHitTestTypeInternal.FirstColumnHeaderLeft:
                    {
                        Debug.Assert(!this.dataGridViewState2[DATAGRIDVIEWSTATE2_messageFromEditingCtrls]);
                        if (Math.Abs(this.ptMouseDownGridCoord.X - ptGridCoord.X) >= DataGridView.DragSize.Width ||
                            Math.Abs(this.ptMouseDownGridCoord.Y - ptGridCoord.Y) >= DataGridView.DragSize.Height)
                        {
                            BeginColumnRelocation(this.ptMouseDownGridCoord.X, this.ptMouseDownCell.X);
                        }
                        break;
                    }
                }
            }
        }
CellMouseMove上受保护的虚拟空间(DataGridViewCellMouseEventArgs e)
{
如果(e.ColumnIndex>=this.Columns.Count)
{
抛出新ArgumentOutOfRangeException(“e.ColumnIndex”);
}
如果(e.RowIndex>=this.Rows.Count)
{
抛出新ArgumentOutOfRangeException(“e.RowIndex”);
}
DataGridViewCell DataGridViewCell=GetCellInternal(e.ColumnIndex,e.RowIndex);
Assert(dataGridViewCell!=null);
如果(e.RowIndex>=0&&dataGridViewCell.MouseMoveUnsharesRowInternal(e))
{
DataGridViewRow DataGridViewRow=this.Rows[e.RowIndex];
GetCellInternal(e.ColumnIndex,e.RowIndex).OnMouseMoveInternal(e);
}
其他的
{
dataGridViewCell.OnMouseMoveInternal(e);
}
DataGridViewCellMouseEventHandler eh=this.Events[EVENT_DATAGRIDVIEWCELLMOUSEMOVE]作为DataGridViewCellMouseEventHandler;
如果(eh!=null&&!this.dataGridViewOper[dataGridViewOper\u不适]&&&!this.IsDisposed)
{
呃(这个,e),;
}
如果(!this.dataGridViewState1[dataGridViewState1\u Scrolled SinceMouseDown]&&
!this.dataGridViewOper[dataGridViewOper\u trackColResize]&&
!this.dataGridViewOper[dataGridViewOper\u trackRowResize]&&
!this.dataGridViewOper[dataGridViewOper\u trackColRelocation]&&
!this.dataGridViewOper[dataGridViewOper\u trackColHeadersResize]&&
!this.dataGridViewOper[dataGridViewOper\u trackRowHeadersResize]&&
此.AllowUserToOrderColumns&&
this.SelectionMode!=DataGridViewSelectionMode.FullColumnSelect&&
this.SelectionMode!=DataGridViewSelectionMode.ColumnHeaderSelect&&
e、 按钮==鼠标按钮。左侧&&
this.ptMouseDownCell.Y==-1&&
此.ptMouseDownCell.X>=0&&
this.ptMouseDownCell.X=DataGridView.DragSize.Width||
Math.Abs(this.ptmousedownggridcoord.Y-ptGridCoord.Y)>=DataGridView.DragSize.Height)
{
BeginColumnRelocation(this.ptMouseDownGridCoord.X,this.ptMouseDownCell.X);
}
打破
}
}
}
}

我想移动列,找到了解决方案,只需覆盖OnMouseDown并更改private字段

    private static FieldInfo _dataGridViewState1FieldInfo = null;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (_dataGridViewState1FieldInfo == null)
        {
            var type = typeof (DataGridView);
            var bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
                            | BindingFlags.Static;
            _dataGridViewState1FieldInfo = type.GetField("dataGridViewState1", bindFlags);
        }

        if (_dataGridViewState1FieldInfo != null)
        {
            BitVector32 bits = (BitVector32) _dataGridViewState1FieldInfo.GetValue(this);
            if (bits[0x00000800])
            {
                bits[0x00000800] = false;
                _dataGridViewState1FieldInfo.SetValue(this, bits);
            }
        }

        base.OnMouseDown(e);
    }

你想做什么?是想固定立柱还是想移动立柱