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