.NET TableLayoutPanel - PullRequest
       4

.NET TableLayoutPanel

0 голосов
/ 08 марта 2011

В основном у меня есть tablelayoutpanel, она в настоящее время используется для системы POS. Когда я вызываю SetColumnSpan для элемента управления Button, таблица tablelayout добавляет дополнительную строку и портит мой экран.

Кто-нибудь сталкивался с этим раньше?

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

Немного отредактировать очищенный код

void button_MouseUp(object sender, EventArgs e)
    {
        try
        {
            TableLayoutPanelCellPosition pos = tableLayoutPanel1.GetCellPosition((Control) sender);
            POSButton productButton = GetProductButton(sender);

            tableLayoutPanel1.SuspendLayout();

            if (productButton == null)
            {
                DeleteButton(sender, pos);
                return;
            }

            productButton.Dock = DockStyle.Fill;

            EditModeHookButton(productButton);
            tableLayoutPanel1.Controls.Remove((Control) sender);

            tableLayoutPanel1.Controls.Add(productButton, pos.Column, pos.Row);

            if (productButton.TableRowSpan > 0)
                tableLayoutPanel1.SetRowSpan(productButton, productButton.TableRowSpan);

            if (productButton.TableColumnSpan > 0)
                tableLayoutPanel1.SetColumnSpan(productButton, productButton.TableColumnSpan);

            buttonManager.Save(tableLayoutPanel1);
            tableLayoutPanel1.ResumeLayout();
        }
        catch(OperationCanceledException)
        {

        }
    }

Вот функция диспетчера кнопок, которая сериализует расположение кнопок.

    public void Save(ScreenTabkeLayoutPanel panel)
    {
        List<ButtonSaveInfo> buttons = new List<ButtonSaveInfo>();
        foreach (Control control in panel.Controls)
        {
            TableLayoutPanelCellPosition pos = panel.GetCellPosition(control);
            ButtonSaveInfo info;

            if (control is POSButton)
                info = ((POSButton)control).ConvertToButtonInfo(pos);
            else
                info = control.ConvertToButtonInfo(pos);

            buttons.Add(info);
        }

        AppDataSerializer.SaveBinary(buttons,buttonPath);
    }

Вот код, который загружает / заполняет экран кнопками

 private void LoadButtonsFromFile(ScreenTabkeLayoutPanel panel)
    {
        List<ButtonSaveInfo> buttons = AppDataSerializer.LoadBinary<List<ButtonSaveInfo>>(buttonPath);
        panel.SuspendLayout();
        foreach (ButtonSaveInfo info in buttons)
        {
            switch (info.ButtonType)
            {
                case (int) ButtonType.PRODUCT:

                    POSButton productButton = info.ConvertToPosButton();
                    wireButtonEvents(productButton);
                    panel.Controls.Add(productButton, info.ColumnIndex, info.RowIndex);

                    if (productButton.TableRowSpan > 0)
                        panel.SetRowSpan(productButton, productButton.TableRowSpan);

                    if (productButton.TableColumnSpan > 0)
                        panel.SetColumnSpan(productButton, productButton.TableColumnSpan);


                    break;

                default:
                    Control control = BuildBlankButton();
                    wireButtonEvents(control);
                    panel.Controls.Add(control, info.ColumnIndex, info.RowIndex);
                    break;
            }
        }
        FillEmptySpacesWillBlankButtons(panel);
        panel.ResumeLayout();
    }

Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Убедитесь, что у вас нет элемента управления в натянутой ячейке.

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

Убедитесь, что вы удалили все элементы управления из ячейки, которую вы планируете охватить.

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

1 голос
/ 08 марта 2011

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

...