110,534
社区成员
发帖
与我相关
我的任务
分享
public partial class MainForm : Form
{
// 数据表
DataTable dataTable = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
private int indexOfItemUnderMouseToDrag = -1;
private int indexOfItemUnderMouseToDrop = -1;
private int indexOfItemUnderMouseOver = -1;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection("data source=127.1;initial catalog=stlivead;user id=sa;password=sa;"))
{
SqlCommand cmd = new SqlCommand("select * from db", conn);
da.SelectCommand = cmd;
da.Fill(dataTable);
}
dataGridView.DataSource = dataTable;
}
private void dataGridView_MouseDown(object sender, MouseEventArgs e)
{
var hitTest = dataGridView.HitTest(e.X, e.Y);
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);
}
}
private void dataGridView_MouseUp(object sender, MouseEventArgs e)
{
dragBoxFromMouseDown = Rectangle.Empty;
}
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;
OnRowDragOver(-1);
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;
// * 执行拖放操作,我觉得可能是这里有问题,因为拖放要移除源行新建一个目的行,不知道为什么数据库更新的时候会自己insert拖动的行
var tempRow = dataTable.NewRow();
tempRow.ItemArray = dataTable.Rows[indexOfItemUnderMouseToDrag].ItemArray;
((DataTable)dataGridView.DataSource).Rows.RemoveAt(indexOfItemUnderMouseToDrag);
if (indexOfItemUnderMouseToDrag < indexOfItemUnderMouseToDrop)
indexOfItemUnderMouseToDrop--;
((DataTable)dataGridView.DataSource).Rows.InsertAt(tempRow, indexOfItemUnderMouseToDrop);
//选中拖动的行
dataGridView.Rows[indexOfItemUnderMouseToDrop].Selected = true;
//行号重排
for (int i = 0; i < dataGridView.Rows.Count; i++)
{
dataGridView.Rows[i].Cells["orderid"].Value = i + 1;
}
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.Update(dataTable);
dataTable.AcceptChanges();
}
}