C# Winform расстояние между панелями при изменении ширины\высоты

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by stas1kus, 9 Sep 2013.

  1. stas1kus

    stas1kus New Member

    Joined:
    25 Jun 2012
    Messages:
    33
    Likes Received:
    4
    Reputations:
    0
    всем привет.
    у меня тут возникла проблема с динамически созданными панелями, когда я меняю размер формы своей, N-ое кол-во панелей меняют свою ширину тоже, и при необходимости (зависит от текста внутри панели), меняют свою высоту.. ну и потом когда ширина формы делается больше - панели по высоте\ширине становятся обратно нормальными... НО когда высота у панелей изменяется - нужно чтоб расстояние оставалось неизменным... пробовал разные методы уже, но все получается криво... подскажите плиз.

    Code:
    public void checkResize(string msg_out, object panel_sender, object text_msg_sender, int panHei, int numbs)
            {
                Panel pan_item = (Panel)panel_sender;
                Label lab_item = (Label)text_msg_sender;
                char[] msg_arr = msg_out.ToCharArray();
                int panWidthRaznost = 308 - pan_item.Width;
                int panWidth = pan_item.Width;
                if (int.Parse(pan_item.Name) != numbs - 1) //если это 1ая панель - не делать изменения локации для нее
                {
                    if (panWidth < buff) //если панель сужается - делать расстояние между панелями больше
                    {
                        this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
                       /* if (panWidthRaznost % 15 == 0)  //попытка №2
                        {
                            for (int i = int.Parse(pan_item.Name); i >= 0; i--)
                            {
                                panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y + 1);
                               // panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y + (pan_item.Lines));
                            }
                        } */
                    }
                    if (panWidth > buff) //если панель растягивается - делать расстояние между панелями меньше
                    {
                        this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
                        /*if (panWidthRaznost % 15 == 0) //попытка №2
                        {
                            for (int i = int.Parse(pan_item.Name); i >= 0; i--)
                            {
                                panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y - 1);
                            }
                        }*/
                    }
                    buffCountPan++;
                    if (buffCountPan == panel1.Controls.Count - 1)
                    {
                        buff = panWidth;
                        buffCountPan = 0;
                    }
                    
                }
                if (msg_arr.Length > 26) //если кол-во символов в сообщении меньше - не менять размеры панели и лейбла
                {
                    int panWidthRaznostForHeight = (308 - pan_item.Width) / 4; //разность на сколько уменьшили панель
                    pan_item.Height = panHei + panWidthRaznostForHeight; //разность на сколько нужно увеличить панель
                    lab_item.MaximumSize = new System.Drawing.Size(300 - panWidthRaznost, 100); //изменение ширины лейбла сообщения
                    lab_item.MinimumSize = new System.Drawing.Size(300 - panWidthRaznost, 14); //изменение ширины лейбла сообщения
                }
            }
     
            private void setPanelLocation(Panel pnl)
            {
                int iPanelOrder = Convert.ToInt32(pnl.Tag);
                if (iPanelOrder == 0)
                {
                    pnl.Top = MinimumStartLocation;
                }
                else
                {
                    pnl.Top = this.Controls.OfType<Panel>().ToList().Find(pan => Convert.ToInt32(pan.Tag) == iPanelOrder - 1).Bottom + DistanceBetweenPanel;
                }
            }
    
    так-же выложу для большего понятия кусок проекта...

    http://www.sendspace.com/file/9og7co
     
  2. stas1kus

    stas1kus New Member

    Joined:
    25 Jun 2012
    Messages:
    33
    Likes Received:
    4
    Reputations:
    0
    Проблема решена, т.к. если было свойство Dock, то оно все в кучу сворачивало, но свойство что панели не наезжали друг на друга сохранялось. Поэтому с помощью вспомогательной панели, которая на 10рх больше на которую наложились остальные панели - все получилось.
     
    1 person likes this.