我有一个为空的Datagridview。 用户可以将值从列表中拖放到复制文本的Datagridview中。用户还可以在Datagrid视图中拖放文本以移动文本。
但是我还想要行能够拖放(更改它们出现的顺序)。
我希望通过使用以下两个答案提供的代码来分别完成这两项工作:
https://stackoverflow.com/a/21133200/10086705(针对单元格) How could I Drag and Drop DataGridView Rows under each other?(用于拖动行)。
问题在于它们都使用相同的事件,我当前的解决方案是使用复选框查看要使用的事件。 (检查行,不检查单元格)虽然很难,但我认为这不是最有效/用户友好的方法。
这是拖动单元格的代码。 (不要介意尝试捕获它们是一个临时解决方案。)
private Rectangle dragBoxFromMouseDown;
private object valueFromMouseDown;
private DataGridViewCell origin;
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y))
{
try
{
DragDropEffects dropEffect = dataGridView1.DoDragDrop(valueFromMouseDown, DragDropEffects.Copy);
}
catch{}
}
}
}
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
origin = sender as DataGridViewCell;
var hittestInfo = dataGridView1.HitTest(e.X, e.Y);
if (hittestInfo.RowIndex != -1 && hittestInfo.ColumnIndex != -1)
{
valueFromMouseDown = dataGridView1.Rows[hittestInfo.RowIndex].Cells[hittestInfo.ColumnIndex].Value;
if (valueFromMouseDown != null)
{
origin = dataGridView1.Rows[hittestInfo.RowIndex].Cells[hittestInfo.ColumnIndex] as DataGridViewCell;
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 dataGridView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y));
if (e.Effect == DragDropEffects.Copy)
{
string cellvalue = e.Data.GetData(typeof(string)) as string;
var hittest = dataGridView1.HitTest(clientPoint.X, clientPoint.Y);
if (hittest.ColumnIndex != -1 && hittest.RowIndex != -1)
{
try
{
if (dataGridView1[hittest.ColumnIndex, hittest.RowIndex].Value.ToString() != "")
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to replace this value?", "!", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
dataGridView1[hittest.ColumnIndex, hittest.RowIndex].Value = cellvalue;
try{origin.Value = "";}catch{}
}
else if (dialogResult == DialogResult.No){}
}
}
catch
{
dataGridView1[hittest.ColumnIndex, hittest.RowIndex].Value = cellvalue;
try{origin.Value = "";}catch{}
}
}
}
}
我希望的是使用IF语句来检查是否已选择行单元格或是否已选择RowHeader。对于单元格,只能将文本从一个单元格移动到另一单元格;如果选择了RowHeader,则应将行移动到新位置(不覆盖任何现有行)
答案 0 :(得分:0)
解决了这个问题,“如果(dataGridView1.SelectedRows.Count == 1)”就可以了。如果是这样,它将移动该行而不是该单元格。从以下站点得到它: https://www.codeproject.com/Articles/811035/Drag-and-Move-rows-in-DataGridView-Control