我有一个 TableLayoutPanel,它在运行时使用文本文件填充行(从文本文件中获取每一行,并将其放入包含在新行中的单元格中)。代码如下所示:
public static string UrlList= @"C:\Users\Berisha\Desktop\URLs.txt";
string[] UrlRows = System.IO.File.ReadAllLines(@UrlList);
private void InitPaths()
{
int a = 0;
int c = 1;
while (a < UrlRows.Length-1)
{
//new label
var label = new Label();
label.Dock = DockStyle.Fill;
label.AutoSize = false;
label.Text = UrlRows[a];
label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
label.Size = new System.Drawing.Size(22, 13);
label.BackColor = System.Drawing.Color.Transparent;
TBP.Controls.Add(label, 3, c); //Add to TableLayoutPanel
a++;
c++;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我希望能够手动编辑源代码,所以我写了一个方法来删除新创建的所有内容,但似乎卡在这里,因为它不起作用:
private void clearPaths()
{
int c = UrlRows.Length - 1;
while (c <= UrlRows.Length …Run Code Online (Sandbox Code Playgroud) 我必须动态地添加很多Control对象TableLayoutPanel,这需要花费大量时间。我还需要能够通过 的行和列索引访问控件,TableLayoutPanel反之亦然。
TableLayoutPanel.Controls有(据我所知)3 种添加Control对象的方法:
.Add(Control) - 继承,位置为 -1,-1 与 .GetCellPosition(Control) .Add(Control, column, row) - 位置和索引是正确的,但可能有点慢?.AddRange (Control[]) - 继承的,更快的,显示的位置是正确的(每个单元格都被填充,如果有必要,在之后设置列跨度),但位置是-1,-1 .GetCellPosition(Control) 有没有一种方法结合的优势.Add(Control, column, row和.AddRange(Control[]),即大量的添加Control对象快的TableLayoutPanel同时仍然能够获得的位置Control编程?
编辑以包含评论中的一些信息:
SuspendLayout()和ResumeLayout() TableLayoutPanel需要约2秒至负载。根据分析器,大约 50% 的时间花在添加控件上,20% 的时间花在添加控件上ResumeLayout()编辑:MCVE
我的原始代码更复杂,但这是TableLayoutPanel添加控件花费大部分时间(2/3)的示例。我正在寻找一种方法来加快速度。
public class FormTLPTest : Form
{
public FormTLPTest()
{
Height = 800;
Width = 800;
TableLayoutPanel tlp = …Run Code Online (Sandbox Code Playgroud) 我有两个托管TableLayoutPanels的标签页,我用标签和文本框动态填充.第一个获得96个标签和96个文本框,其闪烁是可接受/可容忍的,所以我没有费心添加SuspendLayout/ResumeLayout对.
然而,第二个获得96个标签和288个文本框,其绘画/闪烁是无法容忍的.IOW,192个控件似乎没问题,但384肯定不行.
我在动态创建控件之前调用SuspendLayout,然后在finally块中调用ResumeLayout,但删除了它们,瞧!像第一个tabPage/TLP一样,闪烁是可以接受的.
为什么减法加法有效呢?
我想知道是否可以在单个tableLayoutPanel中添加多个项目?目前,我只能插入一个项目,它不会接受任何其他内容.我想要一个包含标签和按钮的richtextBox.有可能吗?谢谢!我不是要求代码,我只需要知道是否可以手动将这些项拖放到tableLayoutPanel中的单个单元格中.
有了TableLayoutPanel的所有属性,我不知道为什么这不简单.
我有一个tableLayoutPanel有两列.我试图在第一列中放置一个标签,以将其用作标题.我想将它放在相对于列的特定坐标中,但我不知道如何使用边距或填充属性.必须有一个比这更简单的方法.我尝试过使用锚点和停靠属性,但没有用.
有人能告诉我一个如何做到这一点的例子吗?为什么我不能将标签拖到我想要的位置?
我有一个包含三行和一列的表格布局:
我想要的是在进度完成之前隐藏第二行,如下所示:
在互联网上,我发现了两件事:
那么我该如何真正隐藏这一行呢.不删除,不调整大小但实际上将其隐藏起来.
我有一个TableLayoutPanel,每当我将标签放入其中一个单元格时,它就会捕捉到左上角.我怎样才能做到这一点或改变它的位置.
此外,是否可以更改特定单元格的背景颜色?
谢谢!
我正在创建一个表格布局面板来显示字典中的值,但是表格布局面板不断切割我放入单元格的14个字符的Label控件.我试图摆弄我的表布局面板的ColumnStyles,但没有一个选项会使Label控件真正"适合"进入单元格.我已经尝试了所有可用的列样式SizeTypes:
自动调整大小(带有文本值的标签每次都会裁剪为14个字符("1234567890ABCD"),尽管没有控件的列(间隔符)会缩小为空)
百分比(没有任何影响 - 即使我将列类型(值,键,空格)加权为不同大小,也没有列更宽.)
绝对(使列x像素宽,但标签仍然以14个字符切断 - 即使单元格宽度为1,000像素)
我也试过搞乱标签的Size属性,但我无法编辑,因为我"无法修改'System.Windows.Forms.Control.Size'的返回值,因为它不是变量"(无论如何)这意味着).
因此,在完成所有这些选项后,如何使完整标签出现在表格单元格中而不会被切断为14个字符?
这是生成表格布局面板的代码.它使用我构建的自定义类(GridDisplay)来保存包含Control,行号,列号和一些其他字段的对象列表(GridDisplayCell).该类允许我添加/删除/移动/插入控件到列表,然后使用Generate()函数一次性构建表格布局(而不是提前确定它的大小或在我添加项目时重新调整大小).
private void FillInCustomerData()
{
GridDisplay grid = new GridDisplay(tl_TopLeft);
int rowMax = 8;
int columnLabelIndex = 0;
int curRow = 0;
int curCol = 0;
foreach (var item in DD.AllCustomerData["BasicInfo"]) //Dictionary<string, object>
{
if (curRow == rowMax)
{
curRow = 0;
curCol = columnLabelIndex + 2; //1 for key column, 1 for value column
}
var keyLabel = new Label();
keyLabel.Text = item.Key;
var valueLabel = new Label();
valueLabel.Text …Run Code Online (Sandbox Code Playgroud) 我试图建立一个包含tablelayoutpanel的用户控件。在此面板中,我需要动态添加3列,每列具有不同的宽度和5行,这些行的所有外壳都具有相同的高度(tablelayoutpanel高度的20%)。
column1的绝对宽度应为20,column2的绝对宽度取决于其内容的宽度(带有.dock = fill的文本框)column3的绝对宽度为30。
我的代码:
Private Sub BuildGUI()
If Rows > 0 Then
tlp.Controls.Clear()
tlp.ColumnStyles.Clear()
tlp.RowStyles.Clear()
If Style = Styles.Adding Then
tlp.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 30))
tlp.ColumnStyles.Add(New ColumnStyle(SizeType.Autosize))
tlp.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 20))
tlp.ColumnCount = 3
tlp.RowStyles.Add(New RowStyle(SizeType.AutoSize, 20%))
tlp.RowStyles.Add(New RowStyle(SizeType.AutoSize, 20%))
tlp.RowStyles.Add(New RowStyle(SizeType.AutoSize, 20%))
tlp.RowStyles.Add(New RowStyle(SizeType.AutoSize, 20%))
tlp.RowStyles.Add(New RowStyle(SizeType.AutoSize, 20%))
tlp.RowCount = Rows
For i = 0 To Rows - 1
Dim L As New Label
Dim T As New TextBox
Dim C As New CheckBox
With L
.BackColor = Color.Aqua
'.Dock = …Run Code Online (Sandbox Code Playgroud) 我添加到我的按钮之间有一些间距TableLayoutPanel.我删除了Button中的边框,并在Panel中将Margin和Padding设置为0.但我继续得到那个间距.
tableLayoutPanel.RowCount设置为8,Rows集合我添加了8行Size Type Absolute.
我错过了什么吗?这是代码:
private void FillSelectLayout()
{
tableLayoutPanelSelect.Controls.Clear();
tableLayoutPanelSelect.RowStyles.Clear();
tableLayoutPanelSelect.RowCount = 8;
for (int i = 0; i < 8; i++)
{
Button buttonSelector = new Button();
buttonSelector.Height = 64;
buttonSelector.Width = 100;
buttonSelector.FlatStyle = FlatStyle.Flat;
buttonSelector.FlatAppearance.BorderSize = 0;
buttonSelector.BackColor = Color.Yellow;
tableLayoutPanelSelect.Controls.Add(buttonSelector, 0, i);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是它的显示方式: