Как удалить (удалить) пробел между текстовыми полями после удаления некоторых элементов управления? - PullRequest
0 голосов
/ 25 августа 2018

Я недавно работаю с C #, и я спрашиваю здесь, потому что я не нашел решение поиска в Google и другие вопросы по SO, я объясню, что делает мой пример приложения:

Когда я запускаю его, он по умолчанию отображает форму с текстовым полем, это текстовое поле всегда будет отображаться, после ввода некоторого текста и нажатия клавиши ввода будет создано новое текстовое поле и новая кнопка (все элементы управления, даже текстовое поле по умолчанию внутри панели), и новые текстовые поля имеют ту же функциональность, что и текстовое поле по умолчанию, когда я нажимаю кнопку, сгенерированную рядом с ее текстовым полем, она удаляет саму кнопку и текстовое поле, но после этого, если я удаляю некоторые случайные текстовые поля, она оставляет пробел между этими элементами управления, как можно реорганизовать этот контент так, чтобы между ними не было места?

enter image description here

Как вы можете видеть на картинке, можете ли вы сказать мне, как можно это исправить, или дать мне совет, как этого добиться? спасибо, кстати, этот метод я использую для генерации кнопок и текстовых полей

private void GenerarTextBox()
{
    panelContenedor.VerticalScroll.Value = panelContenedor.VerticalScroll.Minimum;

    TextBox tb = new TextBox();
    tb.Text = "Prueba " + id;
    tb.Name = "txtBox" + id;
    tb.KeyDown += new KeyEventHandler(TextBox_Keydown);

    Button bt = new Button();
    bt.Cursor = Cursors.Hand;
    bt.Text = "X";
    bt.Name = "btnPrueba" + id;
    bt.Click += new EventHandler(ClickBotones);

    Point p = new Point(20, 30 * id);
    Point pb = new Point(130, 30 * id);

    tb.Location = p;
    bt.Location = pb;

    panelContenedor.Controls.Add(tb);
    panelContenedor.Controls.Add(bt);

    tb.Focus();
    id++;
}

А это для удаления текстовых полей и кнопок

private void ClickBotones(object sender, EventArgs e)
{
    Button bt = sender as Button;

    string nombreBoton = bt.Name;
    string idBoton = nombreBoton.Substring(9);
    string nombreTextBox = "txtBox" + idBoton;

    foreach (Control item in panelContenedor.Controls.OfType<Control>())
    {
        if (item.Name == nombreTextBox)
        {
            panelContenedor.Controls.Remove(item);
            panelContenedor.Controls.Remove(bt);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы можете разместить свои динамические элементы управления на FlowLayoutPanel. Либо непосредственно, либо сгруппированы вместе в Panel или UserControl.

Установите для свойства FlowDirection FlowLayoutPanel значение TopDown. FlowLayoutPanel автоматически упорядочит ваши элементы управления. Вы также можете установить для свойства WrapContents значение False и AutoScroll в значение true, чтобы появилась полоса прокрутки.

В качестве альтернативы вы можете использовать FlowDirection = LeftToRight, поместить текстовое поле и кнопку непосредственно на FlowLayoutPanel и разрешить перенос дочерних элементов управления (WrapContents = True). В дочерних элементах управления появляется новое свойство FlowBreak. Можно установить значение True, чтобы последний элемент управления отображался в строке и позволял обернуть следующий элемент независимо от ширины FlowLayoutPanel.

.

Вы также можете поиграть со свойством Margin дочерних элементов управления, чтобы управлять их макетом в FlowLayoutPanel, так как свойство Location становится бесполезным.

FlowLayoutPanel (а также Panel) доступен на панели инструментов в разделе «Контейнеры».

0 голосов
/ 25 августа 2018

Когда вы удаляете элементы управления, вам нужно сделать пересчет позиций. Поэтому, когда вы добавили их в последовательности, вы можете перейти с:

bool repos = false;
Point p;
foreach (Control item in panelContenedor.Controls.OfType<Control>())
    {
        if (repos)
        {
             Point tmp = item.Location;              
             item.Location = p;
             p = tmp;
        }


        if (item.Name == nombreTextBox)
        {
            panelContenedor.Controls.Remove(item);
            panelContenedor.Controls.Remove(bt);
            repos = true;
            p = item.Location;
        }

    }
...