Member 12739829 Ответов: 1

Как отключить привязку flowlayout во время выполнения


Я создаю небольшой проект, где я хочу перетащить метку из одной flowLayoutPanel в другую.


namespace test999
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int shrewsbutyTotal;
        int donningtonTotal;
        //int margin = 10;
        Point move;




        private void Form1_Load(object sender, EventArgs e)
        {
            labelBackgroundColour();
            flowLayoutPanel1.BorderStyle = BorderStyle.FixedSingle;
            flowLayoutPanel2.BorderStyle = BorderStyle.FixedSingle;
            makeMoveable();
            updateTotals();

            shrewsbutyTotal = flowLayoutPanel1.Controls.Count;
            donningtonTotal = flowLayoutPanel2.Controls.Count;
            lbl_total_shrewsbury.Text = "Shrewsbury Vehicle Count: " + shrewsbutyTotal.ToString();
            lbl_total_donnington.Text = "Donnington Vehicle Count: " + donningtonTotal.ToString();

        }
        void updateTotals()
        {
            shrewsbutyTotal = flowLayoutPanel1.Controls.Count;
            donningtonTotal = flowLayoutPanel2.Controls.Count;
            lbl_total_shrewsbury.Text = "Shrewsbury Vehicle Count: " + shrewsbutyTotal.ToString();
            lbl_total_donnington.Text = "Donnington Vehicle Count: " + donningtonTotal.ToString();
        }



        void labelMouseDown(object sender, MouseEventArgs e)
        {
            flowLayoutPanel1.Cursor = Cursors.Hand;
            move = e.Location;

        }
        void labelMouseMove(object sender, MouseEventArgs e)
        {
            Control o = (Control)sender;
            if (e.Button == MouseButtons.Left)
            {
                o.Left += e.X - move.X;
                o.Top += e.Y - move.Y;

            }
        }
        void lableMouseUp(object sender, MouseEventArgs e)
        {
            foreach (Label l in flowLayoutPanel1.Controls)
            {
                if ((flowLayoutPanel1.Location.X + l.Right) > flowLayoutPanel1.Right)
                {
                    flowLayoutPanel1.Controls.Remove(l);
                    flowLayoutPanel2.Controls.Add(l);
                    updateTotals();
                }
            }
            foreach (Label l in flowLayoutPanel2.Controls)
            {
                if ((flowLayoutPanel2.Location.X + l.Left < flowLayoutPanel2.Left))
                {
                    flowLayoutPanel2.Controls.Remove(l);
                    flowLayoutPanel1.Controls.Add(l);

                    updateTotals();
                }
            }

        }





        void labelBackgroundColour()
        {

            foreach (Label l in flowLayoutPanel1.Controls)
            {
                l.BackColor = Color.Yellow;

            }
            foreach (Label l in flowLayoutPanel2.Controls)
            {
                l.BackColor = Color.Yellow;

            }
        }
        void makeMoveable()
        {
            foreach (Label l in flowLayoutPanel1.Controls)
            {
                l.MouseDown += new MouseEventHandler(labelMouseDown);
                l.MouseMove += new MouseEventHandler(labelMouseMove);
                l.MouseUp += new MouseEventHandler(lableMouseUp);
            }
            foreach (Label l in flowLayoutPanel2.Controls)
            {
                l.MouseDown += new MouseEventHandler(labelMouseDown);
                l.MouseMove += new MouseEventHandler(labelMouseMove);
                l.MouseUp += new MouseEventHandler(lableMouseUp);
            }
        }

    }
}


Что я уже пробовал:

Я смог создать это с помощью groupboxs и других контейнеров, но боролся с этим. Я поставил добавленный код, который OnMouseUp, если метка находится справа от контейнера, удаляет ее из первого контейнера и добавляет во второй. но с flowLayoutPanels он продолжает привязывать его обратно к выбору макета, когда пользователь пытается переместить его.

BillWoodruff

Пожалуйста, уточните:

1. вы с помощью перетаскивания код, как вы протестировали, и она работает с помощью перетаскивания/удаление метки из одного контейнера в другой ?

2. Когда вы перетаскиваете метку в границы второй панели TableLayoutPanel: что вы наблюдаете ?

Вы понимаете, что когда добавленный / отброшенный элемент управления размещается на панели FlowLayoutPanel, то он автоматически обрабатывается ? Понимаете ли вы, что делает свойство расширения FlowBreak, которое FlowLayoutPanel предоставляет своим дочерним элементам управления ?

Member 12739829

1. Да, используя код dragdrop, который я тестировал, он работает, однако если бы я не "suspendlayout ()", то каждый раз, когда объект перетаскивался, он продолжал бы возвращаться в исходное положение. теперь, когда я использую " suspendlayout ()", он этого не делает.
2. Когда я перетаскиваю метку в границы, она "удаляет" ее с первой панели и "добавляет" ко второй

1 Ответов

Рейтинг:
8

Member 12739829

добавьте этот код в MouseDown

flowLayoutPanel1.SuspendLayout();
flowLayoutPanel2.SuspendLayout();


затем этого в мыши вверх
flowLayoutPanel1.ResumeLayout();
flowLayoutPanel2.ResumeLayout();