问题
I want to override the behavior of a mouse click in the DataGridView header/column cell (top, left cell). That cell causes all rows to be selected. Instead, I want to stop it from selecting all rows. I see an event for RowHeaderSelect and ColumnHeaderSelect but not one for that top, left header cell.
Any ideas? Am I just being blind?
回答1:
This is the dissasembled code of what happens when you click that cell:
private void OnTopLeftHeaderMouseDown()
{
if (this.MultiSelect)
{
this.SelectAll();
if (-1 != this.ptCurrentCell.X)
{
this.SetCurrentCellAddressCore(this.ptCurrentCell.X, this.ptCurrentCell.Y, false, false, false);
}
}
In order for you to prevent this behavior you have 2 solutions:
- Disable multi selection (if your business logic permits)
Inherit your own datagrid and override
OnCellMouseDown
(something like this)protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) { if (e.RowIndex == -1 && e.ColumnIndex == -1) return; base.OnCellMouseDown(e); }
回答2:
I know this is late but hopefully it will help someone. The code below worked for me in a similar scenario.
private void MyDataGridView_MouseUp(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo hitInfo = this.MyDataGridView.HitTest(e.X, e.Y);
if (hitInfo.Type == DataGridViewHitTestType.TopLeftHeader)
{
MyDataGridView.ClearSelection();
}
}
回答3:
You could gain some control over the click event using this hack :)
private void dataGridView1_Click(object sender, EventArgs e)
{
MouseEventArgs args = (MouseEventArgs)e;
DataGridView dgv = (DataGridView)sender;
DataGridView.HitTestInfo hit = dgv.HitTest(args.X, args.Y);
if (hit.Type == DataGridViewHitTestType.TopLeftHeader)
{
// do something here
}
}
来源:https://stackoverflow.com/questions/1504620/datagridview-override-top-left-header-cell-click-select-all