спецификация явно не запрещает или препятствует ему, таким образом, я был бы склонен говорить, что это позволяется.
Microsoft видит его тот же путь (я могу услышать бормотание в аудитории), они заявляют в статье MSDN об эти , УДАЛЯЮТ Метод Платформы Услуг передачи данных ADO.NET :
, Если УДАЛИТЬ запрос включает тело объекта, тело проигнорировано [...]
Дополнительно, вот то, что RFC2616 (HTTP 1.1) должен сказать в отношении запросов:
Content-Length
, или Transfer-Encoding
заголовок (разделите 4.3) Для ответов, это было определено:
Я только что заглянул в свой код. В одном приложении я просто добавляю элементы управления, но без указания индекса, а когда закончу, просто перебираю стили строк и устанавливаю тип размера на AutoSize. Таким образом, простое добавление их без указания индексов, кажется, добавляет строки как задумано (при условии, что GrowStyle установлен на AddRows).
В другом приложении я очищаю элементы управления и устанавливаю для свойства RowCount необходимое значение. Это не добавляет RowStyles. Затем я добавляю свои элементы управления, на этот раз указав индексы, и добавляю новый RowStyle ( RowStyles.Add (new RowStyle (...)
), и это тоже работает.
Итак, выберите один из них методы, они оба работают. Я помню головную боль, которую доставила мне панель компоновки стола.
, который я сделал на прошлой неделе. Установите 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;
Это странная конструкция, но свойство 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
по ходу процесса, иначе все будет работать медленно, так как вся форма будет перестраиваться после добавления каждого элемента управления.
Вот мой код для добавления новой строки в двухколоночный 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 и создать новый.