拖放后的Datagridview行突出显示 [英] Datagridview row highlight after drag and drop
问题描述
如果我拖累&例如,在我的datagridview中从第1行到第8行删除一行,第1行将在操作结束后突出显示。这非常不自然。我希望第8行能够突出显示。我怎么能这样做?
If I drag & drop a row in my datagridview from row 1 to row 8 for example, row 1 will be highlighted after the action is over. This is very unnatural. I would expect row 8 to be highlighted. How can I do that?
即使我使用像DataGridView1.Clearselection()这样的语句,它也会清除整个数据网格,但在命令后第1行将突出显示。
Even when I use a statement like DataGridView1.Clearselection() it does clear the whole datagrid but right after the command the row 1 will highlight.
推荐答案
嗨大家,
我不知道你是如何实现拖拽目的的,我做了一个简单演示,在我的项目中,我清除选择,然后在datagridview_MouseMove事件中重置它:
I'm not sure how do you achieve the drag purpose, I made a simple demo, in my project, I clear the selection then reset it in the datagridview_MouseMove event with:
//Clear
dataGridView.ClearSelection();
//Set
dataGridView.Rows[indexOfItemUnderMouseToDrop].Selected = true;
请参考以下项目:
public partial class MainForm : Form
{
DataTable dataTable = new DataTable();
private int indexOfItemUnderMouseToDrag = -1;
private int indexOfItemUnderMouseToDrop = -1;
private Rectangle dragBoxFromMouseDown = Rectangle.Empty;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Column1", typeof(string));
dataTable.Columns.Add("Column2", typeof(string));
for (int id = 1; id <= 20; id++)
dataTable.Rows.Add(id, string.Format("A{0}", id), string.Format("B{0}", id));
dataGridView.DataSource = dataTable;
}
private void dataGridView_MouseDown(object sender, MouseEventArgs e)
{
var hitTest = dataGridView.HitTest(e.X, e.Y);
if (hitTest.Type != DataGridViewHitTestType.Cell)
return;
indexOfItemUnderMouseToDrag = hitTest.RowIndex;
if (indexOfItemUnderMouseToDrag > -1)
{
Size dragSize = SystemInformation.DragSize;
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
}
else
dragBoxFromMouseDown = Rectangle.Empty;
}
private void dataGridView_MouseUp(object sender, MouseEventArgs e)
{
dragBoxFromMouseDown = Rectangle.Empty;
}
private void dataGridView_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) != MouseButtons.Left)
return;
if (dragBoxFromMouseDown == Rectangle.Empty || dragBoxFromMouseDown.Contains(e.X, e.Y))
return;
if (indexOfItemUnderMouseToDrag < 0)
return;
var row = dataGridView.Rows[indexOfItemUnderMouseToDrag];
DragDropEffects dropEffect = dataGridView.DoDragDrop(row, DragDropEffects.All);
//Clear
dataGridView.ClearSelection();
//Set
dataGridView.Rows[indexOfItemUnderMouseToDrop].Selected = true;
}
private void dataGridView_DragOver(object sender, DragEventArgs e)
{
Point p = dataGridView.PointToClient(new Point(e.X, e.Y));
var hitTest = dataGridView.HitTest(p.X, p.Y);
if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == indexOfItemUnderMouseToDrag)
{
e.Effect = DragDropEffects.None;
return;
}
e.Effect = DragDropEffects.Move;
}
private void dataGridView_DragDrop(object sender, DragEventArgs e)
{
Point p = dataGridView.PointToClient(new Point(e.X, e.Y));
var hitTest = dataGridView.HitTest(p.X, p.Y);
if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == indexOfItemUnderMouseToDrag + 1)
return;
indexOfItemUnderMouseToDrop = hitTest.RowIndex;
var tempRow = dataTable.NewRow();
tempRow.ItemArray = dataTable.Rows[indexOfItemUnderMouseToDrag].ItemArray;
dataTable.Rows.RemoveAt(indexOfItemUnderMouseToDrag);
if (indexOfItemUnderMouseToDrag < indexOfItemUnderMouseToDrop)
indexOfItemUnderMouseToDrop--;
dataTable.Rows.InsertAt(tempRow, indexOfItemUnderMouseToDrop);
}
}
希望这会有所帮助!
问候,
Frankie
这篇关于拖放后的Datagridview行突出显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!