为什么事件“ gridControl1_DragDrop”和“ gridControl1_DragOver”不起作用

时间:2018-12-02 11:41:24

标签: c# winforms devexpress

DevExpress 17.2.7

我尝试在网格内移动一行
元素“用户控件”位于“ gridControl1”。

代码包含事件:
-“ gridView1_MouseDown”;
-“ gridView1_MouseMove”;
-“ gridControl1_DragOver”;
-“ gridControl1_DragDrop”。
事件“ gridView1_MouseDown”,“ gridView1_MouseMove”起作用。

事件“ gridControl1_DragOver”,“ gridControl1_DragDrop”不起作用。
换句话说,他们甚至没有反应。

如何使“ gridControl1_DragOver”,“ gridControl1_DragDrop”事件起作用?

enter image description here enter image description here enter image description here

public partial class Frm10UC : UserControl
    {
        #region *** Переменные
        // *** Переменные
        ConectDB conectDB;

        #region Перетаскивание 
        #region *** Сортировка
        const string OrderFieldName = "sorting";
        #endregion ** 

        #endregion

        #endregion *** Переменные

        public Frm10UC()
        {
            InitializeComponent();
        }

        private void Frm10UC_Load(object sender, EventArgs e)
        {
            // Подключение к БД
            // conectDB = new ConectDB(Convert.ToInt32(aIncement));
            conectDB = new ConectDB();
            conectDB.connect();

            // gridControl. Заполнение данными
            gridControl1.DataSource = conectDB.dt;
            gridView1.BestFitColumns();

            // Строка. Добавить "Новую запись"
            // Отображение строки нового элемента для добавления строк в представление.
            gridView1.OptionsView.NewItemRowPosition = NewItemRowPosition.Top; // Available modes: Top, Bottom, None (// Доступные режимы: сверху, снизу, нет)            

            // Сортировка
            // SortData();

            #region *** Сортировка
            gridView1.PopulateColumns(); // Создает столбцы сетки/поля карты для полей в связанном источнике данных View.

            gridView1.Columns[OrderFieldName].SortOrder = DevExpress.Data.ColumnSortOrder.Ascending; //Сортировка.  "Ascending" - по возрастанию
            gridView1.OptionsCustomization.AllowSort = false; // Получает или задает значение, определяющее, могут ли конечные пользователи применять сортировку данных .

            gridView1.OptionsView.ShowGroupPanel = false; // Возвращает или задает значение, определяющее, является ли панель группы видимой.
            #endregion *** Сортировка
        }

        #region *** События

        GridHitInfo downHitInfo = null; // Содержит информацию о конкретной точке в виде сетки .
        // https://documentation.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo.members
        private void gridView1_MouseDown(object sender, MouseEventArgs e)
        {
            GridView view = sender as GridView;
            downHitInfo = null;

            GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y));
            if (Control.ModifierKeys != Keys.None)
                return;
            if (e.Button == MouseButtons.Left && hitInfo.InRow && hitInfo.RowHandle != GridControl.NewItemRowHandle)
                downHitInfo = hitInfo;
        }

        private void gridView1_MouseMove(object sender, MouseEventArgs e)
        {
            GridView view = sender as GridView;
            if (e.Button == MouseButtons.Left && downHitInfo != null)
            {
                Size dragSize = SystemInformation.DragSize;
                Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2,
                    downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);

                if (!dragRect.Contains(new Point(e.X, e.Y)))
                {
                    view.GridControl.DoDragDrop(downHitInfo, DragDropEffects.All);
                    downHitInfo = null;
                }
            }
        }

        private void gridControl1_DragOver(object sender, DragEventArgs e) // когда объект перетаскивается по границам элемента управления;
        {
            if (e.Data.GetDataPresent(typeof(GridHitInfo)))
            {
                GridHitInfo downHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
                if (downHitInfo == null)
                    return;

                GridControl grid = sender as GridControl;
                GridView view = grid.MainView as GridView;
                GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));
                if (hitInfo.InRow && hitInfo.RowHandle != downHitInfo.RowHandle && hitInfo.RowHandle != GridControl.NewItemRowHandle)
                    e.Effect = DragDropEffects.Move;
                else
                    e.Effect = DragDropEffects.None;
            }
        }

        private void gridControl1_DragDrop(object sender, DragEventArgs e) //когда операция перетаскивания завершена; 
        {
            GridControl grid = sender as GridControl;
            GridView view = grid.MainView as GridView;
            GridHitInfo srcHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
            GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));
            int sourceRow = srcHitInfo.RowHandle;
            int targetRow = hitInfo.RowHandle;
            MoveRow(sourceRow, targetRow);
        }

        private void MoveRow(int sourceRow, int targetRow)
        {
            if (sourceRow == targetRow)
                return;
            GridView view = gridView1;

            DataRow row0 = null;
            DataRow row1 = null;
            DataRow row2 = null;

            decimal val1 = 0;
            decimal val2 = 0;

            if (targetRow == sourceRow + 1)
            {
                row1 = view.GetDataRow(sourceRow);
                row2 = view.GetDataRow(targetRow);
                val1 = (decimal)row1[OrderFieldName];
                val2 = (decimal)row2[OrderFieldName];
                row1[OrderFieldName] = val2;
                row2[OrderFieldName] = val1;

                view.FocusedRowHandle = sourceRow + 1;
                return;
            }

            if (sourceRow == targetRow + 1)
            {
                row1 = view.GetDataRow(sourceRow);
                row2 = view.GetDataRow(targetRow);
                val1 = (decimal)row1[OrderFieldName];
                val2 = (decimal)row2[OrderFieldName];
                row1[OrderFieldName] = val2;
                row2[OrderFieldName] = val1;

                view.FocusedRowHandle = sourceRow - 1;
                return;
            }


            row0 = view.GetDataRow(targetRow - 1);
            row1 = view.GetDataRow(targetRow);
            row2 = view.GetDataRow(targetRow + 1);
            DataRow dragRow = view.GetDataRow(sourceRow);
            val1 = (decimal)row1[OrderFieldName];
            if (row2 == null)
                dragRow[OrderFieldName] = val1 + 1;
            else
            {
                val2 = (decimal)row2[OrderFieldName];
                if (row0 == null)
                    dragRow[OrderFieldName] = val1 - 1;
                else
                    dragRow[OrderFieldName] = (val1 + val2) / 2;
            }
        }
        #endregion *** События

    }

1 个答案:

答案 0 :(得分:1)

您是否已将GridView控件的 AllowDrop 属性设置为 true

没有此设置,事件将不会触发。