none
перестановка строк в dataGridView

    Вопрос

  • Добрый всем день!

    Ребят, в dataGridView есть замечательное свойство AllowUserToOrderColumns, которое позволяет пользователю перемещать СТОЛБЦЫ. Но нет аналогичного свойства AllowUserToOrderRows, которое позволило бы перемещать СТРОКИ. Или может быть я чего-то не знаю. Можно ли каким-то образом организовать перестановку строк? И как это проще всего сделать, чтобы пользователь мог просто "перетягивать" их и менять местами?

    Заранее спасибо!

    И всех с Наступающим Новым годом!!!


    Андрей

    31 декабря 2018 г. 12:17

Ответы

  • Вот минимальный пример перетаскивания строк:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            
            public Form1()
            {
                InitializeComponent();
                dataGridView1.AllowDrop = true;               
            }
    
            private void dataGridView1_DragOver(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
    
            private void dataGridView1_DragDrop(object sender, DragEventArgs e)
            {
                Point p = dataGridView1.PointToClient(new Point(e.X, e.Y));            
                int TargetRow = dataGridView1.HitTest(p.X, p.Y).RowIndex;
                int DraggedRow = (int)e.Data.GetData(typeof(int));
    
                if (TargetRow < 0 || DraggedRow < 0 || TargetRow >= dataGridView1.Rows.Count-1 || 
                    DraggedRow >= dataGridView1.Rows.Count-1 || TargetRow == DraggedRow) return;
    
                var row = dataGridView1.Rows[DraggedRow];
                dataGridView1.Rows.RemoveAt(DraggedRow);
                dataGridView1.Rows.Insert(TargetRow, row);            
            }
    
            private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button.HasFlag(MouseButtons.Left))
                {
                    int DraggedRow = e.RowIndex;
                    DragDropEffects dropEffect = dataGridView1.DoDragDrop((object)DraggedRow,DragDropEffects.Move); 
                }
            }   
            
        }
        
    }
    

    Источник: https://social.msdn.microsoft.com/Forums/windows/en-US/16b0a44e-35a0-4bc8-9ccd-ec2c62c95a55/select-and-drag-a-datagridview-row-with-a-single-click?forum=winforms

    2 января 2019 г. 11:20

Все ответы

  • Поясните зачем вам понадобилось переставлять строки? Это не имеет никакого смысла с точки зрения организации данных. Обычно строки лишь сортируются или же фильтруются по каким либо критериям.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 января 2019 г. 17:46
    Модератор
  • Есть один расчет, не буду вдаваться в его подробности. Если коротко, то в строках содержится информация о залегании того или иного грунта (каждая строка представляет собой пласт (его характеристики) того или иного вида грунта, почвы и т.п.). И в зависимости от того, как они залегают зависит просадка и другие параметры. Хотелось бы дать пользователю возможность переставлять строки, то есть менять комбинации залегания различных пластов и рассчитывать общую просадку, так как пластов бывает много, и нужно потом заново забивать всю информацию.

    Может быть dataGridView не самый лучший вариант для этого, тогда какой компонент лучше использовать??


    Андрей

    1 января 2019 г. 18:53
  • Есть один расчет, не буду вдаваться в его подробности. Если коротко, то в строках содержится информация о залегании того или иного грунта (каждая строка представляет собой пласт (его характеристики) того или иного вида грунта, почвы и т.п.). И в зависимости от того, как они залегают зависит просадка и другие параметры. Хотелось бы дать пользователю возможность переставлять строки, то есть менять комбинации залегания различных пластов и рассчитывать общую просадку, так как пластов бывает много, и нужно потом заново забивать всю информацию.

    Может быть dataGridView не самый лучший вариант для этого, тогда какой компонент лучше использовать??


    Андрей

    Для вашего случая скорее всего подойдет специально для этого разработанный компонент. Но никто не мешает реализовать "перетаскивание" (или другой способ упорядочить) данных в DGV.

    Например, добавьте в источник данных невидимый столбец который определяет порядок данных, сортировку по нему и изменяйте его значения при "перетаскивании".


    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 января 2019 г. 19:12
    Модератор
  • А можно немного подробней. А еще лучше с примером кода =)) На форме есть один DGV  (5 строк 4 столбца) и пусть при запуске он автоматически заполняется какими-нибудь значениями. Каким образом добавить этот "невидимый" столбец, чтобы с его помощью можно было менять местами строки??


    Андрей

    1 января 2019 г. 19:22
  • А можно немного подробней. А еще лучше с примером кода =)) На форме есть один DGV  (5 строк 4 столбца) и пусть при запуске он автоматически заполняется какими-нибудь значениями. Каким образом добавить этот "невидимый" столбец, чтобы с его помощью можно было менять местами строки??


    Андрей

    Так же как и видимые столбцы, конечно. Затем в поиске набрать "hide data grid view column" чтоб узнать как его убрать.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 января 2019 г. 19:45
    Модератор
  • Вы меня либо не поняли, либо не хотите давать исчерпывающие ответы. Каким образом мне поможет это столбец ???!! да еще и "НЕВИДИМЫЙ" !!?

    Мне нужно чтобы пользователь мог менять местами строки!!! Организовать перетаскивание мышкой, как в свойстве AllowUserToOrderColumns --- как я понял, слишком большой геморрой.

    Придется, наверное, делать также, как это сделано в dataGridView, когда вы выбираете пункт "Правка столбцов" и там сбоку есть две стрелочки (вверх и вниз), с помощью которых можно поменять местами столбцы:

    


    Андрей

    1 января 2019 г. 20:06
  • Для начала, у вас DataGridView привязана к источнику данных или нет?
    2 января 2019 г. 8:03
  • Нет, не привязана. Есть кнопка "Добавить строку", по нажатию на которую добавляется новая строка с некоторыми данными.  Привязка данных мне, как-бы не нужна.

    Вот на картинке. Мне, например, нужно поменять 2-ую и 6-ую строки местами, а потом еще какие-нибудь, чтобы не перебивать цифры вручную.


    Андрей

    2 января 2019 г. 10:35
  • Вот минимальный пример перетаскивания строк:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            
            public Form1()
            {
                InitializeComponent();
                dataGridView1.AllowDrop = true;               
            }
    
            private void dataGridView1_DragOver(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
    
            private void dataGridView1_DragDrop(object sender, DragEventArgs e)
            {
                Point p = dataGridView1.PointToClient(new Point(e.X, e.Y));            
                int TargetRow = dataGridView1.HitTest(p.X, p.Y).RowIndex;
                int DraggedRow = (int)e.Data.GetData(typeof(int));
    
                if (TargetRow < 0 || DraggedRow < 0 || TargetRow >= dataGridView1.Rows.Count-1 || 
                    DraggedRow >= dataGridView1.Rows.Count-1 || TargetRow == DraggedRow) return;
    
                var row = dataGridView1.Rows[DraggedRow];
                dataGridView1.Rows.RemoveAt(DraggedRow);
                dataGridView1.Rows.Insert(TargetRow, row);            
            }
    
            private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button.HasFlag(MouseButtons.Left))
                {
                    int DraggedRow = e.RowIndex;
                    DragDropEffects dropEffect = dataGridView1.DoDragDrop((object)DraggedRow,DragDropEffects.Move); 
                }
            }   
            
        }
        
    }
    

    Источник: https://social.msdn.microsoft.com/Forums/windows/en-US/16b0a44e-35a0-4bc8-9ccd-ec2c62c95a55/select-and-drag-a-datagridview-row-with-a-single-click?forum=winforms

    2 января 2019 г. 11:20
  • VadimTagil, спасибо, заработало!

    Но теперь появилась другая проблема - при щелчке на кнопку удалить (см. выше картинку) - строка не удаляется. Что нужно поменять в Вашем коде, чтобы перетаскивать можно было только по "первому столбцу", а остальные столбцы не реагировали на перетаскивание ??


    Андрей

    2 января 2019 г. 12:00
  • Все, понял как это сделать!) 

    Андрей

    2 января 2019 г. 12:44