Строки добавления Winforms TableLayoutPanel программно

спецификация явно не запрещает или препятствует ему, таким образом, я был бы склонен говорить, что это позволяется.

Microsoft видит его тот же путь (я могу услышать бормотание в аудитории), они заявляют в статье MSDN об эти , УДАЛЯЮТ Метод Платформы Услуг передачи данных ADO.NET :

, Если УДАЛИТЬ запрос включает тело объекта, тело проигнорировано [...]

Дополнительно, вот то, что RFC2616 (HTTP 1.1) должен сказать в отношении запросов:

  • тело объекта только присутствует, когда тело сообщения присутствует (разделите 7.2)
  • присутствие тело сообщения сообщено включением Content-Length, или Transfer-Encoding заголовок (разделите 4.3)
  • , тело сообщения не должно быть включено, когда спецификация метода запроса не позволяет отправлять тело объекта (разделите 4.3)
  • тело объекта явно запрещается в запросах ТРАССИРОВКИ только, все другие типы запроса неограниченны (разделите 9, и 9.8 конкретно)

Для ответов, это было определено:

  • , включено ли тело сообщения , зависит и от метода запроса и от состояние ответа (разделите 4.3)
  • тело сообщения явно запрещается в ответах НАПРАВИТЬСЯ, запросы (разделите 9, и 9.4 конкретно)
  • , тело сообщения явно запрещается в 1xx (информационное), 204 (никакое содержание), и 304 (не измененный) ответы (разделите 4.3)
  • , все другие ответы включают тело сообщения, хотя это может иметь нулевую длину (разделите 4.3)

81
задан johnnyRose 7 October 2016 в 18:25
поделиться

4 ответа

Я только что заглянул в свой код. В одном приложении я просто добавляю элементы управления, но без указания индекса, а когда закончу, просто перебираю стили строк и устанавливаю тип размера на AutoSize. Таким образом, простое добавление их без указания индексов, кажется, добавляет строки как задумано (при условии, что GrowStyle установлен на AddRows).

В другом приложении я очищаю элементы управления и устанавливаю для свойства RowCount необходимое значение. Это не добавляет RowStyles. Затем я добавляю свои элементы управления, на этот раз указав индексы, и добавляю новый RowStyle ( RowStyles.Add (new RowStyle (...) ), и это тоже работает.

Итак, выберите один из них методы, они оба работают. Я помню головную боль, которую доставила мне панель компоновки стола.

4
ответ дан 24 November 2019 в 09:40
поделиться

, который я сделал на прошлой неделе. Установите GrowStyle на TableLayoutPanel на AddRows или AddColumns , тогда ваш код должен работать:

// Adds "myControl" to the first column of each row
myTableLayoutPanel.Controls.Add(myControl1, 0 /* Column Index */, 0 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl2, 0 /* Column Index */, 1 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl3, 0 /* Column Index */, 2 /* Row index */);

Вот рабочий код, который похоже на то, что вы делаете:

    private Int32 tlpRowCount = 0;

    private void BindAddress()
    {
        Addlabel(Addresses.Street);
        if (!String.IsNullOrEmpty(Addresses.Street2))
        {
            Addlabel(Addresses.Street2);
        }
        Addlabel(Addresses.CityStateZip);
        if (!String.IsNullOrEmpty(Account.Country))
        {
            Addlabel(Address.Country);
        }
        Addlabel(String.Empty); // Notice the empty label...
    }

    private void Addlabel(String text)
    {            
        label = new Label();
        label.Dock = DockStyle.Fill;
        label.Text = text;
        label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
        tlpAddress.Controls.Add(label, 1, tlpRowCount);
        tlpRowCount++;
    }

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

Вот код дизайнера, чтобы вы могли видеть таблицу, с которой я начинаю:

        //
        // tlpAddress
        // 
        this.tlpAddress.AutoSize = true;
        this.tlpAddress.BackColor = System.Drawing.Color.Transparent;
        this.tlpAddress.ColumnCount = 2;
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 25F));
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
        this.tlpAddress.Controls.Add(this.pictureBox1, 0, 0);
        this.tlpAddress.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tlpAddress.Location = new System.Drawing.Point(0, 0);
        this.tlpAddress.Name = "tlpAddress";
        this.tlpAddress.Padding = new System.Windows.Forms.Padding(3);
        this.tlpAddress.RowCount = 2;
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.Size = new System.Drawing.Size(220, 95);
        this.tlpAddress.TabIndex = 0;
73
ответ дан 24 November 2019 в 09:40
поделиться

Это странная конструкция, но свойство TableLayoutPanel.RowCount не отражает счетчик коллекции RowStyles, и аналогично для свойства ColumnCount и коллекции ColumnStyles.

Что мне понадобилось в моем коде, так это вручную обновлять RowCount/ColumnCount после внесения изменений в RowStyles/ColumnStyles.

Вот пример кода, который я использовал:

    /// <summary>
    /// Add a new row to our grid.
    /// </summary>
    /// The row should autosize to match whatever is placed within.
    /// <returns>Index of new row.</returns>
    public int AddAutoSizeRow()
    {
        Panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        Panel.RowCount = Panel.RowStyles.Count;
        mCurrentRow = Panel.RowCount - 1;
        return mCurrentRow;
    }

Другие мысли

  • Я никогда не использовал DockStyle.Fill, чтобы заставить элемент управления заполнить ячейку в Grid; я делал это, устанавливая свойство Anchors элемента управления.

  • Если вы добавляете много элементов управления, убедитесь, что вы вызываете SuspendLayout и ResumeLayout по ходу процесса, иначе все будет работать медленно, так как вся форма будет перестраиваться после добавления каждого элемента управления.

28
ответ дан 24 November 2019 в 09:40
поделиться

Вот мой код для добавления новой строки в двухколоночный TableLayoutColumn:

private void AddRow(Control label, Control value)
{
    int rowIndex = AddTableRow();
    detailTable.Controls.Add(label, LabelColumnIndex, rowIndex);
    if (value != null)
    {
        detailTable.Controls.Add(value, ValueColumnIndex, rowIndex);
    }
}

private int AddTableRow()
{
    int index = detailTable.RowCount++;
    RowStyle style = new RowStyle(SizeType.AutoSize);
    detailTable.RowStyles.Add(style);
    return index;
}

Элемент управления меткой находится в левом столбце, а элемент управления значением - в правом столбце. Элементы управления обычно относятся к типу Label, и для их свойства AutoSize установлено значение true.

Я не думаю, что это имеет большое значение, но для справки, вот код конструктора, который устанавливает detailTable:

this.detailTable.ColumnCount = 2;
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.detailTable.Location = new System.Drawing.Point(0, 0);
this.detailTable.Name = "detailTable";
this.detailTable.RowCount = 1;
this.detailTable.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.detailTable.Size = new System.Drawing.Size(266, 436);
this.detailTable.TabIndex = 0;

Все это работает отлично. Вы должны знать, что существуют некоторые проблемы с удалением элементов управления из TableLayoutPanel динамически с использованием свойства Controls (по крайней мере, в некоторых версиях платформы). Если вам нужно удалить элементы управления, я предлагаю удалить весь TableLayoutPanel и создать новый.

17
ответ дан 24 November 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: