Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Копирование в DataGridView переносом


Автор: okaton 10.12.2008, 13:08
Извиняюсь за клонирование темы.
Подскажите как в DataGridView реализовать Drag&Drop?

Автор: Unlocker 12.12.2008, 00:52
Касательно технологии Drag&Drop могу сказать следующее.
На любом наследнике класса Control (каким DataGridView и является) есть свойство AllowDrop булевского типа.
Если интересует более подробная информация, то рекомендую обратиться к MSDN 2005.
Локальная документация мне выдала следующую ссылку на информацию о свойстве и примере

ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/CPref17/html/P_System_Windows_Forms_Control_AllowDrop.htm
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/CPref17/html/M_System_Windows_Forms_Control_DoDragDrop_1_334b7c3a.htm

рекомендую попробовать штатные средства, прежде чем придумывать нечто уникальное.  smile 

Автор: okaton 12.12.2008, 21:49
с AllowDrop не все так просто...

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

товарищи  smile, если кто-то владеет данной технологией пожалуйста  smile отзовитесь

Автор: okaton 15.12.2008, 22:47
Кое что интересное нашел

Код

        private DataGridViewBehavior _GridBehavior1;
        private DataGridViewBehavior _GridBehavior2;
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            _GridBehavior1 = new DataGridViewBehavior();
            _GridBehavior1.Attach(dataGridView1);
            _GridBehavior2 = new DataGridViewBehavior();
            _GridBehavior2.Attach(dataGridView2);
            _GridBehavior1.Enabled = true;
            _GridBehavior2.Enabled = true;

        }


        public class DataGridViewBehavior
        {      
            private string[,] _Data;
            private DataGridView _Grid;
            private DataGridView.HitTestInfo _HitTest;
            private Point _HitTestPoint;
            private Rectangle _DragBox;
            public bool Enabled { get; set; }

            public void Attach(DataGridView grid)
            {
                _Grid = grid;
                _Data = new string[_Grid.RowCount, _Grid.ColumnCount];
                _Grid.MouseDown += _MouseDown;
                _Grid.MouseMove += _MouseMove;
                _Grid.VirtualMode = true;
                _Grid.AllowUserToAddRows = false;
                _Grid.AllowDrop = true;
                _Grid.DragOver += _DragOver;
                
                _Grid.DragDrop += _DragDrop;
                _Grid.CellValuePushed += (s, e) => _Data[e.RowIndex, e.ColumnIndex] = Convert.ToString(e.Value);
                _Grid.CellValueNeeded += (s, e) => e.Value = _Data[e.RowIndex, e.ColumnIndex];
            }
            
            void _DragDrop(object sender, DragEventArgs e)
            {
                if (Enabled == true)
                {
                    Point p = _Grid.PointToClient(new Point(e.X, e.Y));
                    var ht = _Grid.HitTest(p.X, p.Y);
                    if (ht.Type != DataGridViewHitTestType.Cell)
                        return;
                    if (e.Data.GetDataPresent(DataFormats.Text, true))
                    {
                        var data = e.Data.GetData(DataFormats.Text, true);
                        _Grid.Rows[ht.RowIndex].Cells[ht.ColumnIndex].Value = data;
                    }
                }                
            }

            void _DragOver(object sender, DragEventArgs e)
            {
                if (!e.Data.GetDataPresent(typeof(System.String)))
                {
                    e.Effect = DragDropEffects.None;
                    return;
                }              
                if ((e.KeyState & 4) == 4 && (e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
                {
                    e.Effect = DragDropEffects.Move;
                }
                else if ((e.KeyState & 8) == 8 && (e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
                {
                    e.Effect = DragDropEffects.Copy;
                }
                else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
                {
                    e.Effect = DragDropEffects.Move;
                }
                else
                    e.Effect = DragDropEffects.None; 
            }            
            
            void _MouseDown(object sender, MouseEventArgs e)
            {
                if (Enabled == true)
                {
                    var ht = _Grid.HitTest(e.X, e.Y);
                    if (ht.Type == DataGridViewHitTestType.Cell)
                    {
                        _HitTest = ht;
                        _HitTestPoint = e.Location;
                        _DragBox = new Rectangle(new Point(e.X - (SystemInformation.DragSize.Width / 2), e.Y - (SystemInformation.DragSize.Height / 2)),
                            SystemInformation.DragSize);
                    }
                    else
                        _HitTest = DataGridView.HitTestInfo.Nowhere;
                }
            }
            void _MouseMove(object sender, MouseEventArgs e)
            {
                if (Enabled == true)
                {
                    if (((e.Button & MouseButtons.Left) != MouseButtons.Left)
                        || _HitTest == DataGridView.HitTestInfo.Nowhere
                        || _DragBox.Contains(e.X, e.Y))
                        return;
                    var data = _Grid.Rows[_HitTest.RowIndex].Cells[_HitTest.ColumnIndex].Value;
                    if (data != null)
                        _Grid.DoDragDrop(data, DragDropEffects.All);                
                }
            }
        }

Автор: okaton 17.12.2008, 12:34
Вопрос в следующем: почему работает только копирование? Иконка меняется, а перемещение не работает.

И еще одна непонятность. В word если копировать из таблицы и выделить одну или несколько ячеек в строке, копируется вся
строка в одну ячейку грида. Если выделить несколько символов, то с копируется правильно.
В exel копирование из таблицы нормальное, если выделить несколько ячеек, копируется все в в одну ячейку грида...
Как исправить проблемы с word. Как копировать несколько ячеек из редактора в несколько ячеек грида, и соответственно из грида?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)