c# datagridview中可以实现数据拖动不? c# datagridview中可以实现数据拖动不?就是可以把选中的数据拖动到其他位置如果不行的话,有其他方法不 ? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 理论上可以,在按住鼠标移动时,复复制选中内容在剪切板,松开时粘贴在当前位置你可以参考一下这个[code=C#] #region dgv复制、剪切、 删除、清除、粘贴 /// <summary> /// DataGridView复制 /// </summary> /// <param name="dgv">DataGridView实例</param> private void dgvCopy(ref DataGridView dgv) { if (dgv.GetCellCount(DataGridViewElementStates.Selected) > 0) { try { Clipboard.SetDataObject(dgv.GetClipboardContent()); } catch (Exception MyEx) { MessageBox.Show(MyEx.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } /// <summary> /// DataGridView剪切 /// </summary> /// <param name="dgv">DataGridView实例</param> private void dgvCut(ref DataGridView dgv) { dgvCopy(ref dgv); dgvClear(ref dgv); dgvDel(); } /// <summary> /// DataGridView清除内容 /// </summary> /// <param name="dgv">DataGridView实例</param> private void dgvClear(ref DataGridView dgv) { try { foreach (DataGridViewCell dgvcell in dgv.SelectedCells) { if (dgvcell.ColumnIndex != 0) dgvcell.Value = 0; } } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); } } /// <summary> /// DataGridView删除 /// </summary> /// <param name="dgv">DataGridView实例</param> private void dgvDel() { try { SendKeys.Send("{Del}"); } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); } } /// <summary> /// DataGridView粘贴 /// </summary> /// <param name="dt">DataGridView数据源</param> /// <param name="dgv">DataGridView实例</param> public void dgvPaste(ref DataTable dt, ref DataGridView dgv) { try { int cRowIndex = dgv.CurrentCell.RowIndex; int cColIndex = dgv.CurrentCell.ColumnIndex; //最后一行为新行 int rowCount = dgv.Rows.Count - 1; int colCount = dgv.ColumnCount; //获取剪贴板内容 string pasteText = Clipboard.GetText(); //判断是否有字符存在 if (string.IsNullOrEmpty(pasteText)) return; //以换行符分割的数组 string[] lines = pasteText.Trim().Split('\n'); int txtLength = lines.Length; //去掉空行 for (int si = 0; si < txtLength; si++) { if (lines[si].Trim() == "") { for (int ssi = si; ssi < txtLength - 1; ssi++) { lines[ssi] = lines[ssi + 1]; } txtLength--; } } DataRow row; //判断是修改还是添加,如果dgv中行数减当前行号大于要粘贴的行数,直接修改 if (rowCount - cRowIndex >= txtLength) { for (int j = cRowIndex; j < cRowIndex + txtLength; j++) { //以制表符分割的数组 string[] vals = lines[j - cRowIndex].Trim().Split('\t'); //判断要粘贴的列数与dgv中列数减当前列号的大小,取最小值 int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length; //处理被标记为"Deleted"的行 int l = 0; int j1 = 0; while (l <= j) { if (dt.Rows[j1].RowState != DataRowState.Deleted) l++; j1++; } j1--; row = dt.Rows[j1]; for (int i = 0; i < minColLength; i++) { row[i + cColIndex] = vals[i]; } } } //否则先修改后添加 else { //修改 for (int j = cRowIndex; j < rowCount; j++) { string[] vals = lines[j - cRowIndex].Trim().Split('\t'); int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length; //处理被标记为"Deleted"的行 int l = 0; int j1 = 0; while (l <= j) { if (dt.Rows[j1].RowState != DataRowState.Deleted) l++; j1++; } j1--; row = dt.Rows[j1]; for (int i = 0; i < minColLength; i++) { row[i + cColIndex] = vals[i]; } } //添加 for (int j = rowCount; j < cRowIndex + txtLength; j++) { string[] vals = lines[j - cRowIndex].Trim().Split('\t'); int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length; //新行 row = dt.NewRow(); for (int i = 1; i < dt.Columns.Count; i++) { row[i] = 0; } for (int i = 0; i < minColLength; i++) { row[i + cColIndex] = vals[i]; } //添加到dgv数据源中 dt.Rows.Add(row); } if (cRowIndex == rowCount) { dgv.Rows[dgv.CurrentCell.RowIndex].Selected = true; SendKeys.Send("{Del}"); } } } catch (Exception MyEx) { MessageBox.Show(MyEx.Message); } } private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { dataGridView1.DoDragDrop(e.ColumnIndex, DragDropEffects.Copy); } private void textBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(int))) { e.Effect = DragDropEffects.Copy; } else e.Effect = DragDropEffects.None; } private void textBox1_DragDrop(object sender, DragEventArgs e) { int index = -1; if (e.Data.GetDataPresent(typeof(int))) { index = (int)e.Data.GetData(typeof(int)); } if (index > -1) textBox1.Text = dataGridView1.Columns[index].Name; } } datagridview.用好了后,可以选择一些开源的控件来绑定数据。 感谢三楼——(人生如梦),你总是在我需要的时候出现,感激涕零。这次你写的代码学习了,你写的是不是把datagridview数据拖动到textbox中不?可能是我没有说清楚,我想的是实现在datagridview中把数据从一个地方拖动到datagridview中的另一个地方,不知道可以实现不? public partial class Form1 : Form { public Form1() { InitializeComponent(); //initial dgv dgvColumnName(); dataGridView1.MouseDown += new MouseEventHandler(dataGridView1_MouseDown); dataGridView1.DragEnter += new DragEventHandler(dataGridView1_DragEnter); dataGridView1.DragDrop += new DragEventHandler(dataGridView1_DragDrop); } private void Form1_Load(object sender, EventArgs e) { dataGridView1.ClearSelection(); } private void dgvColumnName() { try { this.dataGridView1.DataSource = DgvOperation.GetDataTable(); this.dataGridView1.Columns[0].HeaderText = "XX1"; this.dataGridView1.Columns[1].HeaderText = "XX2"; this.dataGridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; this.dataGridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; this.dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { //. } } private void dgv_MouseDown(object sender, MouseEventArgs e) { DataGridView.HitTestInfo info = this.dataGridView1.HitTest(e.X, e.Y); if (info.RowIndex != -1 && info.ColumnIndex != -1) { Object value = this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value; if (value != null) { this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value = null; this.DoDragDrop(value, DragDropEffects.Move); } } } private void dgv_DragDrop(object sender, DragEventArgs e) { Point p = this.dataGridView1.PointToClient(new Point(e.X, e.Y)); DataGridView.HitTestInfo info = this.dataGridView1.HitTest(p.X, p.Y); if (info.RowIndex != -1 && info.ColumnIndex != -1) { Object value = (Object)e.Data.GetData(typeof(string)); this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value = value; } } private void dgv_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } }有参考了别人的程序,看下是否达到你的要求了。 thisiscandy的代码我试过了,不行呀,单击后数据消失,但是没有办法拖动到新的地方. 动态类数组 [求助]C#中的datagrid控件在哪添加 C#导出XML问题(急,在线等) 如何实现:能显示 Windows Service 的异常信息的Window 应用程序 F11和F5执行的结果不一样? 关于C#2.0中数据适配器配置向导的问题?在线等 如何让WINFORM上的控件随窗体大小的变化发生位置上的相应变化? 如何在datagrid里动态捆定许多图片 求助,正则表达式的匹配原理。 如何让ListView显示水平滚动条 EnterpriseLibrary 5.0 SqlCe如何引用? C# 判断text为空
你可以参考一下这个
[code=C#] #region dgv复制、剪切、 删除、清除、粘贴
/// <summary>
/// DataGridView复制
/// </summary>
/// <param name="dgv">DataGridView实例</param>
private void dgvCopy(ref DataGridView dgv)
{
if (dgv.GetCellCount(DataGridViewElementStates.Selected) > 0)
{
try
{
Clipboard.SetDataObject(dgv.GetClipboardContent());
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
/// <summary>
/// DataGridView剪切
/// </summary>
/// <param name="dgv">DataGridView实例</param>
private void dgvCut(ref DataGridView dgv)
{
dgvCopy(ref dgv);
dgvClear(ref dgv);
dgvDel(); }
/// <summary>
/// DataGridView清除内容
/// </summary>
/// <param name="dgv">DataGridView实例</param>
private void dgvClear(ref DataGridView dgv)
{
try
{
foreach (DataGridViewCell dgvcell in dgv.SelectedCells)
{
if (dgvcell.ColumnIndex != 0)
dgvcell.Value = 0;
}
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message);
} }
/// <summary>
/// DataGridView删除
/// </summary>
/// <param name="dgv">DataGridView实例</param>
private void dgvDel()
{
try
{
SendKeys.Send("{Del}");
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message);
} }
/// <summary>
/// DataGridView粘贴
/// </summary>
/// <param name="dt">DataGridView数据源</param>
/// <param name="dgv">DataGridView实例</param>
public void dgvPaste(ref DataTable dt, ref DataGridView dgv)
{ try
{
int cRowIndex = dgv.CurrentCell.RowIndex;
int cColIndex = dgv.CurrentCell.ColumnIndex;
//最后一行为新行
int rowCount = dgv.Rows.Count - 1;
int colCount = dgv.ColumnCount;
//获取剪贴板内容
string pasteText = Clipboard.GetText();
//判断是否有字符存在
if (string.IsNullOrEmpty(pasteText))
return;
//以换行符分割的数组
string[] lines = pasteText.Trim().Split('\n');
int txtLength = lines.Length;
//去掉空行
for (int si = 0; si < txtLength; si++)
{
if (lines[si].Trim() == "")
{
for (int ssi = si; ssi < txtLength - 1; ssi++)
{
lines[ssi] = lines[ssi + 1];
}
txtLength--;
}
}
DataRow row;
//判断是修改还是添加,如果dgv中行数减当前行号大于要粘贴的行数,直接修改
if (rowCount - cRowIndex >= txtLength)
{
for (int j = cRowIndex; j < cRowIndex + txtLength; j++)
{
//以制表符分割的数组
string[] vals = lines[j - cRowIndex].Trim().Split('\t');
//判断要粘贴的列数与dgv中列数减当前列号的大小,取最小值
int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length;
//处理被标记为"Deleted"的行
int l = 0;
int j1 = 0;
while (l <= j)
{
if (dt.Rows[j1].RowState != DataRowState.Deleted)
l++;
j1++;
}
j1--;
row = dt.Rows[j1];
for (int i = 0; i < minColLength; i++)
{
row[i + cColIndex] = vals[i];
}
}
}
//否则先修改后添加
else
{
//修改
for (int j = cRowIndex; j < rowCount; j++)
{
string[] vals = lines[j - cRowIndex].Trim().Split('\t');
int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length;
//处理被标记为"Deleted"的行
int l = 0;
int j1 = 0;
while (l <= j)
{
if (dt.Rows[j1].RowState != DataRowState.Deleted)
l++;
j1++;
}
j1--;
row = dt.Rows[j1];
for (int i = 0; i < minColLength; i++)
{
row[i + cColIndex] = vals[i];
}
}
//添加
for (int j = rowCount; j < cRowIndex + txtLength; j++)
{
string[] vals = lines[j - cRowIndex].Trim().Split('\t');
int minColLength = vals.Length > colCount - cColIndex ? colCount - cColIndex : vals.Length;
//新行
row = dt.NewRow();
for (int i = 1; i < dt.Columns.Count; i++)
{
row[i] = 0;
}
for (int i = 0; i < minColLength; i++)
{
row[i + cColIndex] = vals[i];
}
//添加到dgv数据源中
dt.Rows.Add(row);
}
if (cRowIndex == rowCount)
{
dgv.Rows[dgv.CurrentCell.RowIndex].Selected = true;
SendKeys.Send("{Del}");
}
}
}
catch (Exception MyEx)
{
MessageBox.Show(MyEx.Message);
}
}
{
dataGridView1.DoDragDrop(e.ColumnIndex, DragDropEffects.Copy);
} private void textBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(int)))
{
e.Effect = DragDropEffects.Copy;
}
else
e.Effect = DragDropEffects.None; } private void textBox1_DragDrop(object sender, DragEventArgs e)
{
int index = -1;
if (e.Data.GetDataPresent(typeof(int)))
{
index = (int)e.Data.GetData(typeof(int));
}
if (index > -1)
textBox1.Text = dataGridView1.Columns[index].Name;
}
}
{
public Form1()
{
InitializeComponent();
//initial dgv
dgvColumnName();
dataGridView1.MouseDown += new MouseEventHandler(dataGridView1_MouseDown);
dataGridView1.DragEnter += new DragEventHandler(dataGridView1_DragEnter);
dataGridView1.DragDrop += new DragEventHandler(dataGridView1_DragDrop);
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ClearSelection();
}
private void dgvColumnName()
{
try
{
this.dataGridView1.DataSource = DgvOperation.GetDataTable();
this.dataGridView1.Columns[0].HeaderText = "XX1";
this.dataGridView1.Columns[1].HeaderText = "XX2";
this.dataGridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
//.
} }
private void dgv_MouseDown(object sender, MouseEventArgs e)
{
DataGridView.HitTestInfo info = this.dataGridView1.HitTest(e.X, e.Y);
if (info.RowIndex != -1 && info.ColumnIndex != -1)
{
Object value = this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value;
if (value != null)
{
this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value = null;
this.DoDragDrop(value, DragDropEffects.Move);
}
}
}
private void dgv_DragDrop(object sender, DragEventArgs e)
{
Point p = this.dataGridView1.PointToClient(new Point(e.X, e.Y));
DataGridView.HitTestInfo info = this.dataGridView1.HitTest(p.X, p.Y);
if (info.RowIndex != -1 && info.ColumnIndex != -1)
{
Object value = (Object)e.Data.GetData(typeof(string));
this.dataGridView1.Rows[info.RowIndex].Cells[info.ColumnIndex].Value = value;
}
}
private void dgv_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
} }有参考了别人的程序,看下是否达到你的要求了。
thisiscandy的代码我试过了,不行呀,单击后数据消失,但是没有办法拖动到新的地方.