0

私は、ユーザーが 2 つの DevExpress チャート コントロールを交換できるようにしようとしています (ただし、ほとんどすべてのコントロールが機能するはずです...)。一方を他方の上にドラッグします。TabControl に対してこれを実行しました (タブの交換/移動を可能にするため) が、何らかの理由で、ChartControl で同じことを行うのを妨げている何かが欠けているようです。

チャートコントロールの上に灰色のボックスを描画し、ユーザーが好きな場所にドラッグできるようにする必要がありますが、ストライプのある黒い円が表示されます。

これが私がこれまでに書いたコードです。うまくいけば、あなたの誰かが間違いを見つけて、髪を引っ張るのをやめることができます! :)

private void ChartControlMouseMove(object sender, MouseEventArgs e)
{
    // Handle Mouse move only if left button is pressed.
    if (e.Button == MouseButtons.Left)
    {
        var chartControl = (ChartControl)sender;

        // If the mouse moves outside the rectangle, start the drag.
        if (!rectDragBoxFromMouseDown.Equals(Rectangle.Empty)
            & !rectDragBoxFromMouseDown.Contains(e.X, e.Y))
        {
            Invalidate();
            DoDragDrop(chartControl, DragDropEffects.Move);
            CalcRectDragBox(e.X, e.Y);
            Invalidate();
        }
    }
}

private void ChartControlMouseDown(object sender, MouseEventArgs e)
{
    CalcRectDragBox(e.X, e.Y);
}

private void CalcRectDragBox(int x, int y)
{
    // 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.
    var dragSize = SystemInformation.DragSize;
    // Create a rectangle using the DragSize, with the mouse position being
    // at the center of the rectangle.
    rectDragBoxFromMouseDown = new Rectangle(
        new Point(x - (dragSize.Width/2), y - (dragSize.Height/2)), dragSize);
}

private void ChartControlDragOver(object sender, DragEventArgs e)
{
    var chartControl = (ChartControl)sender;

    // get the control we are hovering over.
    var hitInformation = chartControl.CalcHitInfo(chartControl.PointToClient(new Point(e.X, e.Y)));
    if ((hitInformation != null))
    {
        //ChartHitInfo hoverTab = hitInformation;

        if (e.Data.GetDataPresent(typeof(ChartControl)))
        {
            e.Effect = DragDropEffects.Move;
            var dragTab = (ChartControl)e.Data.GetData(typeof(ChartControl));

            if (dragTab != chartControl)
            {
                for (int i = 0; i < layoutControlGroupDashboard.Items.Count; i++)
                {
                    var layoutControlItem = layoutControlGroupDashboard.Items[i] as LayoutControlItem;
                    if (layoutControlItem != null && layoutControlItem.Control == chartControl)
                    {
                        for (int j = 0; j < layoutControlGroupDashboard.Items.Count; j++)
                        {
                            var controlItem = layoutControlGroupDashboard.Items[j] as LayoutControlItem;
                            if (controlItem != null && controlItem.Control == dragTab)
                            {
                                if (!_ignoreNextDrag)
                                {
                                    _ignoreNextDrag = true;
                                    layoutControlGroupDashboard.BeginInit();
                                    var layoutControlItemi = layoutControlGroupDashboard.Items[i] as LayoutControlItem;
                                    if (layoutControlItemi != null)
                                    {
                                        Control tempControlI =
                                            layoutControlItemi.Control;
                                        var layoutControlItemj = layoutControlGroupDashboard.Items[j] as LayoutControlItem;
                                        if (layoutControlItemj != null)
                                        {
                                            layoutControlItemi.BeginInit();
                                            layoutControlItemj.BeginInit();
                                            Control tempControlJ =
                                                layoutControlItemj.Control;


                                            layoutControlItemi.Control =
                                                null;
                                            layoutControlItemj.Control =
                                                null;
                                            layoutControlItemi.Control =
                                                tempControlJ;
                                            layoutControlItemj.Control =
                                                    tempControlI;
                                            layoutControlItemi.EndInit();
                                            layoutControlItemj.EndInit();
                                        }
                                    }

                                    layoutControlGroupDashboard.EndInit();
                                    break;
                                }
                                else
                                {
                                    _ignoreNextDrag = false;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}

繰り返しますが、アイデアは、ユーザーがクリックしてドラッグするだけでコントロールを交換できるようにすることです...うまくいけば、それは私が見逃している単純なものですが、私の人生ではそれを見ることができません!

編集:これは私が試したものです(最初にチャートをパネルに追加しています...)

            Panel panel = new Panel();
            panel.Name = Guid.NewGuid().ToString();
            panel.Controls.Add(chartControl);

            var dashboardItem = new LayoutControlItem(layoutControlDashboard, panel)
                                    {
                                        Padding = new DevExpress.XtraLayout.Utils.Padding(0),
                                        Spacing = new DevExpress.XtraLayout.Utils.Padding(0),
                                        SizeConstraintsType = SizeConstraintsType.Custom
                                    };
4

1 に答える 1

1

以下は、ChartControl が LayoutControl に配置されている場合に機能する、変更された ChartControlDragOver メソッドです。

private void ChartControlDragOver(object sender, DragEventArgs e) {
var chartControl = (ChartControl)sender;

// get the control we are hovering over.
var hitInformation = chartControl.CalcHitInfo(chartControl.PointToClient(new Point(e.X, e.Y)));
if ((hitInformation != null)) {
    //ChartHitInfo hoverTab = hitInformation;

    if (e.Data.GetDataPresent(typeof(ChartControl))) {
        e.Effect = DragDropEffects.Move;
        var dragTab = (ChartControl)e.Data.GetData(typeof(ChartControl));
        if (dragTab == chartControl) return;
        InsertType insertType = InsertType.Left;
        Point hitPoint = chartControl.Parent.PointToClient(new Point(e.X, e.Y));
        if (dragTab.Bounds.Left < hitPoint.X && dragTab.Bounds.Right > hitPoint.X) {
            if (dragTab.Bounds.Top > hitPoint.Y)
                insertType = InsertType.Top;
            else if (dragTab.Bounds.Bottom < hitPoint.Y)
                insertType = InsertType.Bottom;
        } else if (dragTab.Bounds.Right < hitPoint.X)
            insertType = InsertType.Right;
        else if (dragTab.Bounds.Left > hitPoint.X)
            insertType = InsertType.Left;
        LayoutControl layout = (LayoutControl)chartControl.Parent;
        layout.GetItemByControl(dragTab).Move(layout.GetItemByControl(chartControl), insertType);
    }
} else {
    e.Effect = DragDropEffects.None;
}

}

于 2012-06-23T11:02:33.667 に答える