您可以创建两个 HitTestInfo 对象,一个MouseDown
在MouseUp
.
IMO,您也应该使用DataGridView.HitTestInfo
该类,而不是DataGrid.HitTestInfo
尝试不调用或命名DataGridViews
DataGrids
,这与 Control 相似但不同WPF
!
DataGridView.HitTestInfo myHitTestDown, myHitTestUp;
int visibleColumnDown, visibleColumnUp;
private void dataGrid1_MouseUp(object sender, MouseEventArgs e)
{
myHitTestUp = dataGrid1.HitTest(e.X, e.Y);
visibleColumnUp = getVisibleColumn(dataGrid1, e.X);
}
private void dataGrid1_MouseDown(object sender, MouseEventArgs e)
{
myHitTestDown = dataGrid1.HitTest(e.X, e.Y);
visibleColumnDown = getVisibleColumn(dataGrid1, e.X);
}
更新:要在列重新排序后查找列的可见索引,只需使用:
dataGrid1.Columns[myHitTestUp.ColumnIndex].DisplayIndex;
在我发现之前,我写了这个小辅助函数,它的作用是一样的:
int getVisibleColumn(DataGridView dgv, int x)
{
int cx = dgv.RowHeadersWidth;
int c = 0;
foreach (DataGridViewColumn col in dgv.Columns)
{
cx += col.Width; if ( cx >= x) return c; c++;
}
return -1;
}
找出哪个列被洗牌似乎有点困难。有一个事件会为受影响的每一列调用,并且总是首先为被拖动的列调用。这是一种方法:
在类级别创建变量:
List<DataGridViewColumn> shuffled = new List<DataGridViewColumn>();
DataGridViewColumn shuffledColumn = null;
记住第一列:
private void dgvLoadTable_ColumnDisplayIndexChanged(
object sender, DataGridViewColumnEventArgs e)
{
if (shuffledColumn == null) shuffledColumn = e.Column;
}
忘记之前发生的事情:
private void dgvLoadTable_MouseDown(object sender, MouseEventArgs e)
{
shuffledColumn = null;
}
现在你可以使用它了。然而,选择列并不适合洗牌!如果你这样做
shuffledColumn.Selected = true;
SelectionMode
仅当它是FullColumnSelect
或时才会选择它ColumnHeaderSelect
- 在任何一种模式下,洗牌都不起作用,恐怕..