c#  datagridview中可以实现数据拖动不?就是可以把选中的数据拖动到其他位置如果不行的话,有其他方法不 ?

解决方案 »

  1.   

    理论上可以,在按住鼠标移动时,复复制选中内容在剪切板,松开时粘贴在当前位置
    你可以参考一下这个
    [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);
                }
            }
      

  2.   

    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;   
      }
      }
      

  3.   

    datagridview.用好了后,可以选择一些开源的控件来绑定数据。
      

  4.   

    感谢三楼——(人生如梦),你总是在我需要的时候出现,感激涕零。这次你写的代码学习了,你写的是不是把datagridview数据拖动到textbox中不?可能是我没有说清楚,我想的是实现在datagridview中把数据从一个地方拖动到datagridview中的另一个地方,不知道可以实现不?
      

  5.   

        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;
            }    }有参考了别人的程序,看下是否达到你的要求了。
      

  6.   


    thisiscandy的代码我试过了,不行呀,单击后数据消失,但是没有办法拖动到新的地方.