通过拖放移动面板内的文本框,并在移动时重新组织它们

时间:2014-03-24 16:09:49

标签: c# winforms

我一直在寻找,但没有找到答案我的问题了。如果已经有答案,我很抱歉,我没有找到它。请指出我,谢谢。

我在表单中有一个面板(大小:350 * 60)。在这个面板中,我有5个文本框(每个大小:70 * 60)。我希望能够在此面板中执行此元素的拖放操作(或mouseEvents)(如果光标离开此面板,文本框保留在面板上),但只能水平放置。如果我使用文本框1并且我想将其保留在第3个位置,则textbox2和3将向左移动一个位置。如果我想将数字5移动到第二个位置,textbox2,3,4将向右移动一个位置。

我想做一些类似于Windows底部的栏目,你可以在那里控制并在这个栏上移动它们。

如果有人可以帮助我,我会继续找到答案,如果我找到它,我会在这里发布。

我正在使用winform,visual studio,c#为动态导航控件添加.dll。

感谢所有知道如何帮助的人以及其他人。

美好的一天

我发布的代码,任何人都能理解它,可以帮助我:

区域DRAG AND DROP

    // Tengo que probar lo escrito en la libreta, con posInicial, posCruce, areaPermitida, isDragging, sueltaBoton
    TextBox tbInitial = new TextBox();//tb ou je rentre
    TextBox tbFinal = new TextBox();//tb ou je laisse
    Color colorPrimaire = new Color();//pour changer la couleur de rentrage au textbox
    Boolean _mouseDown = false; //si c'est appuyé
    Point _mouseDownPos; // position a l'appuillage du mouse
    Point tbPosInitial, tbPosFinal;// position a l'appuillage et au laissage des tb
    Rectangle tbRectInitial, tbRectFinal; // rectangle des tb initial et final
    // Commence le drag and drop en lui passant le control est proprietées et les types d'effect
    private void tb_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            colorPrimaire = tb.BackColor;
            tbInitial = (sender as TextBox);
            tbPosInitial = tbInitial.Location;
            _mouseDown = true;
            _mouseDownPos = e.Location;
            tbInitial.BringToFront();
            tbRectInitial = tbInitial.DisplayRectangle;
            tbInitial.DragEnter += new DragEventHandler(tbInitial_DragEnter);
        }
    }

    private void tbInitial_DragEnter(object sender, DragEventArgs e)
    {
        if (_mouseDown)//pour pouvoir bouger horizontalement
        {
            Point posPremiere = new Point(70, 0);
            Point posUltime = new Point(nRoles * 70, 0);
            int deltaX = e.X - _mouseDownPos.X;
            int deltaY = e.Y - _mouseDownPos.Y;

            tbInitial.Location = new Point(tb.Left + deltaX, tb.Top /* + deltaY */);
            tbInitial.BackColor = Color.CornflowerBlue;
            tbFinal = (sender as TextBox);
            tbPosFinal = tbFinal.Location;
            tbRectFinal = tbFinal.DisplayRectangle;

            int numRolInicial = tbPosInitial.X / 70;
            int numRolFinal = tbPosFinal.X / 70;
            //Pour commencer le drag                
            tbInitial.DoDragDrop(tbInitial, DragDropEffects.Move);
            //Pour faire bouger les textbox, je dois lui dire que tout les tb from tbInitial jusqu'a tbFinal doivent bouger + ou - une position
            tbInitial.AllowDrop = true;
            //Pour gerer le drop et le leave et le enter sur le tbFinal
            tbFinal.DragEnter += new DragEventHandler(tbFinal_DragEnter);
            tbFinal.DragDrop += new DragEventHandler(tbFinal_DragDrop);
            tbFinal.DragLeave += new EventHandler(tbFinal_DragLeave);
            //Pour ne pas pouvoir aller en dehors les limites
            if (tbPosInitial.X < posPremiere.X)
            {
                tbPosFinal = posPremiere;
            }

            if (tbPosInitial.X > posUltime.X)
            {
                tbPosFinal = posUltime;
            }
        }
    }

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

    private void tbFinal_DragDrop(object sender, DragEventArgs e)
    {
        _mouseDown = false;
        MessageBox.Show("TbInitial location:" + tbPosInitial.ToString());//me da la posicion del raton en el textbox
        MessageBox.Show("TbFinal location:" + tbPosFinal.ToString());//me da la posicion final del textbox

        EventControlAddin(3, tbInitial.Name.PadRight(10) + ";" + (string)tbFinal.Name);

        if (colorPrimaire == Color.Bisque)
        {
            tb.BackColor = Color.Bisque;
        }
        else
        {
            tb.BackColor = Color.Gray;
        }

    }

    private void tbFinal_DragLeave(object sender, EventArgs e)
    {
        //Je dois recommencer tous.
        tb = tbFinal;
        tb.MouseDown += new MouseEventHandler(tb_MouseDown);
    }

    private void tb_MouseMove(object sender, MouseEventArgs e)
    {
        if (_mouseDown)//pour pouvoir bouger horizontalement
        {
            Point posPremiere = new Point(70, 0);
            Point posUltime = new Point(MainPanel.Controls.Count * 70, 0);
            int deltaX = e.X - _mouseDownPos.X;
            int deltaY = e.Y - _mouseDownPos.Y;

            tbInitial.Location = new Point(tb.Left + deltaX, tb.Top /* + deltaY */);
            tbInitial.BackColor = Color.CornflowerBlue;
            tbFinal = (sender as TextBox);
            tbPosFinal = tbFinal.Location;
            tbRectFinal = tbFinal.DisplayRectangle;

            int numRolInicial = tbPosInitial.X / 70;
            int numRolFinal = tbPosFinal.X / 70;
            //Pour faire bouger les textbox, je dois lui dire que tout les tb from tbInitial jusqu'a tbFinal doivent bouger + ou - une position                

            //Pour ne pas pouvoir aller en dehors les limites
            if (tbInitial.Location.X < posPremiere.X)
            {
                tbPosFinal = posPremiere;
            }

            if (tbInitial.Location.X > posUltime.X)
            {
                tbPosFinal = posUltime;
            }
        }
    }


    private void tb_MouseUp(object sender, MouseEventArgs e)
    {
        _mouseDown = false;
        MessageBox.Show("TbInitial location:" + tbPosInitial.ToString());//me da la posicion del raton en el textbox
        MessageBox.Show("TbFinal location:" + tbPosFinal.ToString());//me da la posicion final del textbox

        EventControlAddin(3, tbInitial.Name.PadRight(10) + ";" + (string)tbFinal.Name);

        if (colorPrimaire == Color.Bisque)
        {
            tb.BackColor = Color.Bisque;
        }
        else
        {
            tb.BackColor = Color.Gray;
        }
    }

endregion

0 个答案:

没有答案