none
Arrastrar fila desde un datagridview a otro datagridview RRS feed

  • Pregunta

  • Hola muchachos!! Queria saber si tienen alguna idea de como hacer si tengo dos datagridview en un mismo formulario, arrastrar una fila completa desde un datagridview y depositarlo en otro. Luego tambien en donde quedan esas filas del datagridview(origen) que arrastre asi utilizo los datos.

    Muchas graciasss

    martes, 1 de marzo de 2016 18:31

Respuestas

  • hola

    drag and drop cell from datagridview to another

    tienes que usar los eventos DragEnter, DragOver, DragDrop para poder mover una row

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 1 de marzo de 2016 18:41
  • Ese error es porque la interpolación de cadenas es una funcionalidad nueva en C# 6. Si estás utilizando una versión anterior puedes usar string.Format:

    dataGridView1.DoDragDrop(string.Format("DataGridView1Row|{0}", hitTestInfo.RowIndex),DragDropEffects.Copy | DragDropEffects.Move);

    Por otro lado si estás utilizando la propiedad DataSource para cargar el DataGridView origen no vas a poder eliminar directamente las filas de éste por lo que tendrás que quitar la línea:

    dataGridView1.Rows.RemoveAt(rowIndex);

    del evento DragDrop.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    miércoles, 2 de marzo de 2016 18:17

Todas las respuestas

  • hola

    drag and drop cell from datagridview to another

    tienes que usar los eventos DragEnter, DragOver, DragDrop para poder mover una row

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 1 de marzo de 2016 18:41
  • Leandro, desde ya gracias por tu atencion. Vos sabes que copio el codigo de las respuestas que me figuran en esa pagina y cuando arrastro una fila al otro datagridview me figura en el mousse el signo + para agregar pero cuando suelto no me lo agrega.

    Este es mi codigo

    private Rectangle dragBoxFromMouseDown;
            private object valueFromMouseDown;
            private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
            {
                // Get the index of the item the mouse is below.
                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)
                    {
                        // Remember the point where the mouse down occurred. 
                        // The DragSize indicates the size that the mouse can move 
                        // before a drag event should be started.                
                        Size dragSize = SystemInformation.DragSize;

                        // Create a rectangle using the DragSize, with the mouse position being
                        // at the center of the rectangle.
                        dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
                    }
                }
                else
                    // Reset the rectangle if the mouse is not over an item in the ListBox.
                    dragBoxFromMouseDown = Rectangle.Empty;
            }

            private void dataGridView2_DragDrop(object sender, DragEventArgs e)
            {
                // The mouse locations are relative to the screen, so they must be 
                // converted to client coordinates.
                Point clientPoint = dataGridView2.PointToClient(new Point(e.X, e.Y));

                // If the drag operation was a copy then add the row to the other control.
                if (e.Effect == DragDropEffects.Copy)
                {
                    string cellvalue = e.Data.GetData(typeof(string)) as string;
                    var hittest = dataGridView2.HitTest(clientPoint.X, clientPoint.Y);
                    if (hittest.ColumnIndex != -1
                        && hittest.RowIndex != -1)
                        dataGridView2[hittest.ColumnIndex, hittest.RowIndex].Value = cellvalue;

                }
            }

            private void dataGridView2_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Copy;
            }

            private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    // If the mouse moves outside the rectangle, start the drag.
                    if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y))
                    {
                        // Proceed with the drag and drop, passing in the list item.                    
                        DragDropEffects dropEffect = dataGridView1.DoDragDrop(valueFromMouseDown, DragDropEffects.Copy);
                    }
                }
            }

            private void dataGridView2_DragOver(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Copy;
            }

    martes, 1 de marzo de 2016 18:55
  • Un par de preguntas:

    ¿quieres que las filas se copien al segundo grid o que se muevan? Es decir, ¿la fila movida debería desaparecer del primer grid?

    ¿Cómo cargas los datos en los DataGridView? ¿Utilizas la propiedad DataSource o añades las filas por código a la colección Rows?

    Doy por hecho que ambos DataGridView tienen la misma definición de columnas.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 1 de marzo de 2016 19:16
  • Aquí tienes un ejemplo en el que se mueven filas de un DataGridView1 que se ha cargado añadiendo filas a la colección Rows a un DataGridView2.

    Las filas movidas se eliminan del DataGridView1.

            private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
            {
                var hitTestInfo = dataGridView1.HitTest(e.X, e.Y);
                if (hitTestInfo.RowIndex > -1)
                {
                    dataGridView1.DoDragDrop($"DataGridView1Row|{hitTestInfo.RowIndex}",
                        DragDropEffects.Copy | DragDropEffects.Move);
                }
            }
    
            private void dataGridView2_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = e.Data.GetDataPresent(DataFormats.StringFormat) ? DragDropEffects.Copy : DragDropEffects.None;
            }
    
            private void dataGridView2_DragDrop(object sender, DragEventArgs e)
            {
                string[] dropData = e.Data.GetData(DataFormats.Text).ToString().Split('|');
                if (dropData.Length == 2 && dropData[0] == "DataGridView1Row")
                {
                    int rowIndex = int.Parse(dropData[1]);
                    dataGridView2.Rows.Add(
                        dataGridView1.Rows[rowIndex].Cells.Cast<DataGridViewCell>()
                            .Select(c => c.Value).ToArray());
                    dataGridView1.Rows.RemoveAt(rowIndex);
                }
            }


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 1 de marzo de 2016 19:51
  • Asier, el datagridview1(origen) lo lleno mediante data source, hago una consulta a mi base y me traigo directamente el datatable y lo pongo como datasource, mi idea es que arrastre la fila del datagridview1 y se copie en el segundo y se vea en el datagridview2, pero tambien despues tengo que enviar una consulta a la base con las filas que arrastro, es por eso que tambien quiero saber donde quedan almacenadas esas filas del datagridview2.

    Muchas gracias.

    miércoles, 2 de marzo de 2016 14:51
  • Asier me figura error en esta linea que nose que puede ser?

    dataGridView1.DoDragDrop($"DataGridView1Row|{hitTestInfo.RowIndex}",DragDropEffects.Copy | DragDropEffects.Move);

    Error 1 Carácter '$' inesperado

    Error 2 El término de la expresión '' no es válido

    Error 9 Solo se pueden usar las expresiones de objeto assignment, call, increment, decrement, await y new como instrucción


    miércoles, 2 de marzo de 2016 14:58
  • Ese error es porque la interpolación de cadenas es una funcionalidad nueva en C# 6. Si estás utilizando una versión anterior puedes usar string.Format:

    dataGridView1.DoDragDrop(string.Format("DataGridView1Row|{0}", hitTestInfo.RowIndex),DragDropEffects.Copy | DragDropEffects.Move);

    Por otro lado si estás utilizando la propiedad DataSource para cargar el DataGridView origen no vas a poder eliminar directamente las filas de éste por lo que tendrás que quitar la línea:

    dataGridView1.Rows.RemoveAt(rowIndex);

    del evento DragDrop.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    miércoles, 2 de marzo de 2016 18:17