我已经为此斗争了一段时间了,我发现其他一些人也在为TableLayoutPanel (.net 2.0Winforms)而苦苦挣扎。
Problem
我尝试获取一个“空白”的tablelayoutpanel,它定义了10列,然后在运行时以编程方式添加控件行(即每个单元格一个控件)。
有人可能认为它应该像这样简单
myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */);
但这(对我来说)并没有添加行。所以可能会添加一个行样式
myTableLayoutPanel.RowStyles.Clear();
myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));
但这也不起作用。我深入研究了一下,发现myTableLayoutPanel.RowCount
的使用从设计时到运行时都会发生变化,因此执行myTableLayoutPanel.RowCount++;
实际上不会添加其他行,甚至在为其添加RowStyle条目之前/之后也不会!
我遇到的另一个相关问题是,控件将被添加到显示中,但它们都只是在TableLayoutPanel的第0,0点渲染,此外,它们甚至没有被约束在它们应该显示的单元格边界内(即,在Dock = DockStyle.Fill的情况下,它们仍然看起来太大/太小)。
有没有人有在运行时添加行和控件的工作示例?
发布于 2010-02-02 13:58:06
我上个星期才做的。将TableLayoutPanel
上的GrowStyle
设置为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
总是能给我合适的尺寸。在上面的示例中,我正在归档一个地址卡,它可能会根据地址行为2的帐户或国家/地区的不同而增大或缩小。因为表格布局面板的最后一行或最后一列将会伸展,所以我将空标签放入其中以强制新的空行,然后一切都会很好地排列在一起。
下面是设计器代码,这样您就可以看到我开始时使用的表:
//
// 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;
发布于 2010-02-22 05:52:22
这是一个奇怪的设计,但是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
让控件填充网格中的单元格;我是通过设置控件的Anchors
属性来完成此操作的。SuspendLayout
和ResumeLayout
,否则将运行缓慢,因为在添加每个控件后会重新创建整个窗体。发布于 2010-02-19 00:02:45
下面是向两列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控件位于左列,value控件位于右侧列。这些控件通常是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属性从控件中动态释放控件似乎存在一些问题(至少在框架的某些版本中是这样)。如果您需要删除控件,我建议处理整个TableLayoutPanel并创建一个新的。
https://stackoverflow.com/questions/1142873
复制相似问题