我有一个包含2列TableLayoutPanel的用户控件,并接受命令来动态添加行以显示在单独控件中选择的项目的详细信息.因此,用户将在另一个控件(DataGridView)中选择一行,并在DataGridView的SelectedItemChanged事件处理程序中清除详细控件,然后重新生成新选定项的所有行(可能具有完全不同的细节)从先前选择的项目中显示).这很有用.但是如果我长时间从一个选定的项目移动到另一个项目,刷新变得非常慢(每个3-5秒).这听起来好像我没有妥善处理一切,但我无法弄清楚我错过了什么.这是我清除TableLayoutPanel的代码:
private readonly List<Control> controls;
public void Clear()
{
detailTable.Visible = false;
detailTable.SuspendLayout();
SuspendLayout();
detailTable.RowStyles.Clear();
detailTable.Controls.Clear();
DisposeAndClearControls();
detailTable.RowCount = 0;
detailTable.ColumnCount = 2;
}
private void DisposeAndClearControls()
{
foreach (Control control in controls)
{
control.Dispose();
}
controls.Clear();
}
Run Code Online (Sandbox Code Playgroud)
一旦我完成了将我想要的所有控件加载到TableLayoutPanel中以进行下一个细节显示,这就是我所说的:
public void Render()
{
detailTable.ResumeLayout(false);
detailTable.PerformLayout();
ResumeLayout(false);
detailTable.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
我在TableLayoutPanel中没有使用任何标签(和很少使用TextBox),我在创建它们时将标签和文本框添加到控件列表(在DisposeAndClearControls()中引用).我尝试迭代detailTable.Controls并以这种方式处理它们,但它似乎错过了一半的控件(通过在调试器中逐步执行它来确定).这样我知道我得到了所有.
我会对提高绘图性能的任何建议感兴趣,尤其是导致多次选择降级的原因.
我正在尝试创建一个相当广泛的UserControl,将方形控件合并到设计中,并允许调整大小.因为设计需要正方形,所以我需要TableLayoutPanels中的所有列都具有相同的宽度,因此包含的停靠控件也是方形的.
不幸的是,TableLayoutPanel的行为并没有给我这个结果.
使用TableLayoutPanel,将所有列设置为使用相同百分比的Control,(在一组7列中)给出6个宽度相等的列,以及第7个宽度可变的列.
我知道出现这种情况是因为每7个大小中有6个,在7列周围没有相同数量的列像素,第7列是这个不等式的溢出.
我想我想要的是类似于第8列的其他7列的溢出,允许所有7个"真实"列具有实际相等的宽度,但是对于第8列允许为0宽度.
到目前为止,我找不到允许此行为的设置.
任何人都可以告诉我如何让TableLayoutPanel做我想要的,或者我将不得不开始编写大量的解决方法代码?
编辑:
为了回应Yacoder的回答,我添加了一些代码来演示这个问题,另一个代码显示了使用TableLayoutPanel和Dock属性的标准功能来解决它的不成功,天真的尝试
问题演示:
Public Class Form1
Inherits System.Windows.Forms.Form
Public Sub New()
Me.InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be …Run Code Online (Sandbox Code Playgroud) 在尝试让TableLayoutPanel中的某些标签从其单元格的左上角移动到单元格的中心时,我正在尝试添加填充和/或边距.
但是,我没有尝试过任何工作.这是我尝试过的代码和结果:
// Setting the padding just cuts off the bottom part of the text
//lbl.Padding = new System.Windows.Forms.Padding(1);
// How to set Margin?
//lbl.Margin = new System.Windows.Forms.Margin(1); <- This mimics "Padding" but is not recognized
//lbl.Margin = new Thickness(6); <- This is the only example I could find, but it's for WPF
Run Code Online (Sandbox Code Playgroud) 我正在尝试从a中删除所有空行TableLayoutPanel.到目前为止,我已经能够这样做了
private void RemoveEmptyRows()
{
for (int row = 0; row < tablePanel.RowCount - 1; row++)
{
bool hasControl = false;
for (int col = 0; col < tablePanel.ColumnCount; col++)
{
if (tablePanel.GetControlFromPosition(col, row) != null)
{
hasControl = true;
break;
}
}
if (!hasControl)
tablePanel.RowStyles.RemoveAt(row);
}
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?我的方法似乎太不堪重负了.
我们隐藏了一个控件TableLayoutPanel.我们一直使用以下代码来隐藏不应该可见的行.
int controlRow = m_panel.GetPositionFromControl(control).Row;
m_panel.RowStyles[controlRow].SizeType = SizeType.Absolute;
m_panel.RowStyles[controlRow].Height = 0;
Run Code Online (Sandbox Code Playgroud)
现在我们已经添加了更多行,突然间我们遇到了索引问题.RowStyles比Rows少.

有什么可疑的东西,或者我误解了它的TableLayoutPanel作用?
我试图在其顶部的tablelayoutpanel中添加新行。为此,我使用以下代码:
初始化
TableLayoutPanel panel = new TableLayoutPanel();
panel.ColumnCount = 1;
panel.RowCount = 1;
panel.AutoScroll = true;
panel.Location = new System.Drawing.Point(280, 52);
panel.Size = new System.Drawing.Size(308, 189);
panel.Visible = true;
panel.BackColor = Color.DarkGray;
Controls.Add(panel);
Run Code Online (Sandbox Code Playgroud)
对于每个新行
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16F));
panel.Controls.Add(new Label() { Text = text, AutoSize = false, ForeColor = Color.White, Font = font }, 0, 0);
panel.RowCount = panel.RowCount + 1;
Run Code Online (Sandbox Code Playgroud)
问题 在添加4行之前,它似乎工作正常。例如:
迭代1- >玩家1
迭代2- >玩家2玩家1
迭代3- >玩家3玩家2玩家1
迭代4- >播放器4播放器3播放器2播放器1
问题来了
迭代5- >播放器4播放器5播放器3播放器2播放器1
您对可能发生的事情有任何想法吗?
我有一个winforms vb.net应用程序.在这个winform中,我放置了两个组件:
我试图将StatusStrip工具栏放在winforms和TableLayoutPanel的底部以适应屏幕的其余部分,所以我在这两个组件的下面设置属性:
问题是TableLayoutPanel和StatusStrip工具栏重叠,也就是说,StatusStrip工具栏出现在winforms底部的TableLayoutPanel上.
我试图将TableLayoutPanel放在一个面板中,并将StatusStrip工具栏放在另一个面板中,然后设置面板的停靠属性,包含tablelayoutpanel的面板填充和包含StatusStrip工具栏到底部的那个,但它不起作用.
我目前正在使用Windows Forms在C#中开发应用程序.
我正在使用一个有两列的TableLayoutPanel.如何以编程方式向表中添加新行.我尝试过谷歌搜索,但唯一的问题是我只是发现添加一个新的行样式,这对我来说似乎不对.
谢谢您的帮助
我有一个TableLayoutPanel,我想在我点击的单元格中添加一个控件.
问题是我无法确定在运行时单击的单元格.
如何确定单击的单元格?
如何为tablelayoutpanel提供100%的宽度,以便填充父容器,并在调整窗口大小时调整表的大小.
我的表单现在看起来像这样:

我想动态添加行,所以结果将是这样的:

如果表适合splitcontainer面板会很好.有人知道怎么做吗?
这是我当前向表中添加行的代码:
tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset;
tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
tableLayoutPanel1.Controls.Add(new Label() { Text = "first row:", Anchor = AnchorStyles.Left, AutoSize = true });
tableLayoutPanel1.Controls.Add(new Label() { Text = "second row:", Anchor = AnchorStyles.Left, AutoSize = true });
tableLayoutPanel1.Controls.Add(new Label() { Text = "third row:", Anchor = AnchorStyles.Left, AutoSize = true });
tableLayoutPanel1.Controls.Add(new Label() { Text = "4th row:", Anchor = AnchorStyles.Left, AutoSize = true });
tableLayoutPanel1.Controls.Add(new Label() { Text = "5th row:", Anchor = AnchorStyles.Left, AutoSize = true …Run Code Online (Sandbox Code Playgroud) tablelayoutpanel ×10
c# ×8
winforms ×7
.net ×3
margin ×1
padding ×1
row ×1
statusstrip ×1
vb.net ×1