天道酬勤,学无止境

在运行时动态地将控件添加到TableLayoutPanel(Adding controls to TableLayoutPanel dynamically during runtime)

问题

我有一个从两列零行开始的TableLayoutPanel。 我需要做的是,动态添加一行,并用不同的控件填充这两个列(将是面板)。 在Form1中,我以这种方式创建TableLayout:

TableLayoutPanel Table = new TableLayoutPanel();
Table.Location = new Point(10, 40);
Table.Size = new Size(620,100);
Table.AutoSize = true;
Table.Name = "Desk";
Table.ColumnCount = 2;
Table.RowCount = 0;
Table.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
Table.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.AddRows;
this.Controls.Add(Table);

之后,在运行时,我需要多少行,以及是否用面板或某些标签填充它们。 可能在同一行中的左侧是“面板”,右侧是“标签”等。

回答1

使用这样的东西:

Table.Controls.Add(new Label { Text = "Type:", Anchor = AnchorStyles.Left, AutoSize = true }, 0, 0);
Table.Controls.Add(new ComboBox { Dock = DockStyle.Fill }, 0, 1);

您无需定义行数和列数,它们将自动添加。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Winforms TableLayoutPanel以编程方式添加行(Winforms TableLayoutPanel adding rows programmatically)
    问题 我已经为此进行了一段时间的战斗,并且发现许多其他人也为TableLayoutPanel(.net 2.0 Winforms)感到挣扎。 问题 我正在尝试采用“空白” 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点处呈现,此外
  • 如何编写自动缩放为系统字体和dpi设置的WinForms代码?(How to write WinForms code that auto-scales to system font and dpi settings?)
    问题 简介:有很多评论说“ WinForms不能很好地自动缩放到DPI /字体设置;切换到WPF”。 但是,我认为它基于.NET 1.1。 看来他们实际上在.NET 2.0中实现自动缩放方面做得很好。 至少根据我们到目前为止的研究和测试。 但是,如果你们当中的某些人知道得更多,我们很乐意听取您的意见。 (请不要打扰我们应该切换到WPF ...这不是当前的选择。) 问题: WinForms中的哪些内容不能正确自动缩放,因此应避免? 程序员在编写WinForms代码时应遵循哪些设计准则,以使其能够很好地自动缩放? 到目前为止,我们已经确定的设计准则: 请参阅下面的社区Wiki答案。 那些不正确或不足吗? 我们还应该采用其他准则吗? 还有其他需要避免的模式吗? 任何其他对此的指导将不胜感激。 回答1 不支持正确缩放的控件: 具有AutoSize = False Label ,并且继承了Font 。 在控件上明确设置Font ,使其在“属性”窗口中以粗体显示。 ListView列的宽度不能缩放。 重写窗体的ScaleControl来代替它。 看到这个答案 SplitContainer的Panel1MinSize , Panel2MinSize和SplitterDistance属性具有MultiLine = True TextBox和Font继承。 在控件上明确设置Font ,使其在“属性
  • 在Windows窗体中显示控件的集合(Displaying a collection of controls in Windows Forms)
    问题 我想显示以下内容:- 每行都与一个进程有关(诸如PID,Parent等信息)。 用户可以选中该checkbox ,然后单击“启动”按钮以获取有关该过程的一些动态详细信息。 问题在于CheckedListBox控件不允许多于一列,而其他控件(如ListView (允许多列))不允许将诸如checkbox控件嵌入到一列中。 我想知道是否有一个控件,该控件将使我拥有一系列自定义控件,其中每个自定义控件都包含一个checkbox ,“ Some Text和“ Some Dynamic Text 。 如何在Windows窗体中实现? 提前致谢。 回答1 您可以使用以下任一选项: DataGridView (示例) 您可以使用DataGridView来显示不同类型的多个列,包括TextBox , Label , CheckBox , ComboBox , Image , Button , Link 。 您还可以通过自定义绘画或添加新的自定义列类型来自定义网格的外观。 用户控件您可以创建包含所需的任何其他控件的复合控件或UserControl并将其用作行模板,然后可以通过在Panel或FlowLayoutPanel中托管该用户控件的多个实例来显示所有行。 TableLayoutPanel (示例) 您可以使用包含多个列和行的TableLayoutPanel。
  • 如何在Winforms设计器中访问继承的控件(How to access inherited controls in the winforms designer)
    问题 我正在制作一些控件,这些控件必须具有相同的外观和一些共同的行为,尽管它们是为不同种类的输入而设计的。 因此,我做了一个继承自UserControl的BaseClass,而我所有的控件都继承自BaseClass。 但是,如果我在设计器中添加了针对BaseClass的控件(如TableLayoutPanel),则在设计继承的类时将无法访问它们。 我看到了TableLayoutPanel,但是即使他是“受保护的”,我也无法通过设计器修改它或将控件放入其中。 我可以通过代码轻松访问它,但是我不想失去使用设计器的能力。 现在,我只是从BaseClass中删除了所有控件,在每个继承的类中添加了布局和所有公共控件,然后使用引用在BaseClass中对其进行操作。 但这一点都不令我满意。 有没有一种方法可以使设计器与继承的受保护成员控件一起使用? 环境:C#、. NET 3.5,Visual Studio 2008 编辑以回答SLaks的建议。 我尝试设置一个属性,尽管我不习惯使用它们,但它似乎不起作用。 这是我尝试的代码: public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public TableLayoutPanel
  • 创建可识别DPI的应用程序(Creating a DPI-Aware Application)
    问题 我在C#中有一个表单应用程序。 当我更改监视器的DPI时,所有控件都会移动。 我使用了代码this.AutoScaleMode = AutoScaleMode.Dpi ,但是并不能避免该问题。 有人有主意吗? 回答1 编辑:从.NET 4.7开始,Windows窗体改进了对High DPI的支持。 请在docs.microsoft.com上了解有关此内容的更多信息。它仅适用于Win 10 Creators Update和更高版本,因此根据用户群的不同,可能尚不可行。 困难,但并非不可能。 最好的选择当然是转到WPF,但这可能不可行。 我花了很多时间解决这个问题。 以下是一些规则/准则,可使其在没有FlowLayoutPanel或TableLayoutPanel的情况下正常工作: 始终以默认的96 DPI(100%)编辑/设计您的应用程序。 如果您以120DPI(125%f.ex)进行设计,那么当您回到96 DPI以后再使用它时,它将变得非常糟糕。 我成功使用了AutoScaleMode.Font,但没有尝试太多AutoScaleMode.DPI。 确保在所有容器(窗体,面板,标签页,用户控件等)上使用默认字体大小。 8,25像素。 最好不要对所有容器都在.Designer.cs文件中进行设置,以便它使用容器类中的默认字体。 所有容器必须使用相同的AutoScaleMode
  • 在WinForms应用程序中查找集中控件的首选方法是什么?(What is the preferred way to find focused control in WinForms app?)
    问题 在WinForms中查找当前正在接收用户(键盘)输入的控件的首选/最简单方法是什么? 到目前为止,我已经提出了以下建议: public static Control FindFocusedControl(Control control) { var container = control as ContainerControl; return (null != container ? FindFocusedControl(container.ActiveControl) : control); } 从表单中,可以简单地称为(在.NET 3.5及更高版本中,甚至可以将其定义为表单上的扩展方法)- var focused = FindFocusedControl(this); 这样合适吗 有没有我应该使用的内置方法? 请注意,使用层次结构时,仅对ActiveControl的单个调用是不够的。 想象: Form TableLayoutPanel FlowLayoutPanel TextBox (focused) (formInstance).ActiveControl将返回对TableLayoutPanel的引用,而不是TextBox的引用(因为ActiveControl似乎只返回控件树中的直接活动子级,而我正在寻找叶子控件)。 回答1 如果您已经对Windows
  • 如何在运行时为动态创建的控件添加事件处理程序?(How to add event handler for dynamically created controls at runtime?)
    问题 我正在使用C#Windows应用程序。 我的应用程序从自定义控件库中获取控件(按钮,文本框,富文本框和组合框等),并在运行时动态地将其放入表单中。 我如何使用委托为该控件创建事件处理程序? 以及如何在特定的自定义控件点击事件中添加业务逻辑? 例如: 我有user1,user2,user3,当user1登录时,我只想显示“保存”按钮。 当user2然后仅显示“添加和删除”按钮,而用户3仅显示“添加和更新”按钮时。根据用户创建的文本框和按钮将登录从DB表中获取的信息。保存,更新,删除),以便在动态创建表单控件时为不同的用户保存,添加,删除和更新按钮(保存,添加,删除和更新按钮对象来自同一按钮类) 回答1 使用匿名方法: Button button1 = new Button(); button1.Click += delegate { // Do something }; 使用带有显式参数的匿名方法: Button button1 = new Button(); button1.Click += delegate (object sender, EventArgs e) { // Do something }; 使用匿名方法的lambda语法: Button button1 = new Button(); button1.Click += (object sender
  • 如何为控件及其子控件暂停绘画?(How do I suspend painting for a control and its children?)
    问题 我有一个控件,我必须对其进行较大的修改。 我想完全避免重绘,而SuspendLayout和ResumeLayout不够。 如何为控件及其子控件暂停绘画? 回答1 在我之前的工作中,我们一直在努力获取丰富的UI应用程序以立即流畅地进行绘制。 我们正在使用标准的.Net控件,自定义控件和devexpress控件。 经过大量的谷歌搜索和反射器使用后,我遇到了WM_SETREDRAW win32消息。 当您更新控件时,这实际上会停止控件图形,并且可以将IIRC应用于父/包含面板。 这是一个非常简单的类,演示如何使用此消息: class DrawingControl { [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam); private const int WM_SETREDRAW = 11; public static void SuspendDrawing( Control parent ) { SendMessage(parent.Handle, WM_SETREDRAW, false, 0); } public static void ResumeDrawing( Control parent ) {
  • WPF感悟(3)——关于向窗体动态添加控件
    WPF感悟(3)——关于向窗体动态添加控件 这是一个很有意思的话题。 首先,虽然在讲课的时候,我时常会讲到一些关于动态地向窗体中添加控件的例子,但在实际工作中我却很少用用到要这个技术。一般情况下,控件在窗体上是写好的,只是根据需要显示与隐藏。 其次,也是最重要的——我标题用的是“窗体”没有用Window,这是为什么呢?因为同样看上去是窗体,WinForm编程对应的类是Form,WPF编程对应的类是Window。虽然在运行时(run time)它们都是Windows API用CreateWindowEx函数创建出来的Window Class,但在它们还是.NET类的时候,却有着巨大的区别——特别是体现在内部控件的组织形式上。 WinForm WinForm窗体里的按钮、文本框等供用户操作的对象称为“控件”(controls)。这些控件可以分为两类,一类是非容器控件,这类控件的内部结构是固定不变的,比如一个Button内部只能是一串文字(还可以设置Button的背景图片),如果你想在Button内显示一个图标后跟上一串文字,要么你写一个自定义控件(派生自Button、再来点儿GDI+的技术)、要么你把文字写在图片上整个作为Button的背景图片;另一类是容器控件,它的内部可以装一些其他控件,这类控件的一个特点就是有一个Controls属性,这是一个ControlCollection。
  • 使用窗体调整大小调整控件(Resize Controls with Form Resize)
    问题 我已经阅读了几个堆栈溢出问题,但没有找到解决我的问题的有效方法。 每当调整窗体大小时,如何调整控件大小? 我希望它们在表格变大或变小时变大或变小。 在Visual Basic中,使用form.Zoom属性非常容易(当然,它实际上并不需要调整控件的大小,但是可以解决我所需要的内容)。 不幸的是,这在C#winforms中不可用。 这是我没有运气尝试过的其他方法: private void formMain_Resize(object sender, EventArgs e) {/* double scale; this.scaleWidth = (float)this.Width / (float)this.origWidth; this.scaleHeight = (float)this.Height / (float)this.origHeight; if (this.scaleHeight > this.scaleWidth) { scale = this.scaleHeight; } else { scale = this.scaleWidth; } foreach (Control control in this.Controls) { control.Height = (int)(control.Height * this.scaleHeight); control
  • 动态创建的控件在回发后丢失数据(Dynamically Created Controls losing data after postback)
    问题 实际上,我是在Pageload上创建1个TextBox并将该TextBox添加到Panel 。 现在,我有一个类似Add Another的LinkButton 。 我在该TextBox输入Text,如果需要,我需要通过单击Add Another LinkButton来创建New TextBox 。 实际上,我能够获得计数并重新创建TextBoxes 。 但是问题是,先前生成的Textboxes我输入的文本”丢失了。 有人可以建议我解决这个问题吗? protected void Page_Load(object sender, EventArgs e) { try { if (!IsPostBack) { for (int i = 0; i < 5; i++) { TableRow row = new TableRow(); for (int j = 0; j < 5; j++) { TableCell cell = new TableCell(); TextBox tb = new TextBox(); tb.ID = "TextBoxRow_" + i + "Col_" + j; cell.Controls.Add(tb); row.Cells.Add(cell); } Table1.Rows.Add(row); } } } catch (Exception ex) {
  • Adding controls to TableLayoutPanel dynamically during runtime
    I have a TableLayoutPanel starting with two columns and 0 rows. What I need to do is, dynamically adding a row and filling both of the columns with different controls (it will be panels). In Form1 I am creating the TableLayout this way: TableLayoutPanel Table = new TableLayoutPanel(); Table.Location = new Point(10, 40); Table.Size = new Size(620,100); Table.AutoSize = true; Table.Name = "Desk"; Table.ColumnCount = 2; Table.RowCount = 0; Table.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; Table.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.AddRows; this.Controls
  • 动态地将属性添加到ExpandoObject(Dynamically adding properties to an ExpandoObject)
    问题 我想在运行时动态地将属性添加到ExpandoObject。 因此,例如添加一个字符串属性调用NewProp,我想写一些类似的东西 var x = new ExpandoObject(); x.AddProperty("NewProp", System.String); 这容易吗? 回答1 dynamic x = new ExpandoObject(); x.NewProp = string.Empty; 或者: var x = new ExpandoObject() as IDictionary<string, Object>; x.Add("NewProp", string.Empty); 回答2 如Filip此处所述-http://www.filipekberg.se/2011/10/02/adding-properties-and-methods-to-an-expandoobject-dynamicly/ 您也可以在运行时添加方法。 x.Add("Shout", new Action(() => { Console.WriteLine("Hellooo!!!"); })); x.Shout(); 回答3 这是一个示例帮助程序类,该类将转换Object并返回具有给定对象的所有公共属性的Expando。 public static class dynamicHelper
  • 在网格布局中创建动态按钮-创建魔术正方形UI(Create dynamic buttons in a grid layout - Create a magic square UI)
    问题 我应该使用Windows Forms Application在2D中创建一个魔术方块。 它看起来应该像这样: 但是,用户应该能够决定正方形的大小(3x3、5x5、7x7等)。 我已经在控制台应用程序中编写了代码,但是我不知道如何添加2D图形。 有人已经问过这个问题(如何将结果放入GUI中?),答案之一是使用DataGridView ,但是我不确定那不是我要的内容,因为我做不到看起来像图片。 有什么想法或建议吗? 回答1 您可以使用TableLayoutPanel并向面板动态添加按钮。 如果不需要与按钮进行交互,则可以添加Label 。 动态创建正方形: public void CreateSquare(int size) { //Remove previously created controls and free resources foreach (Control item in this.Controls) { this.Controls.Remove(item); item.Dispose(); } //Create TableLayoutPanel var panel = new TableLayoutPanel(); panel.RowCount = size; panel.ColumnCount = size; panel.BackColor = Color
  • 动态将表单添加到Django表单集中(Dynamically adding a form to a Django formset)
    问题 我想动态地将新表单添加到Django表单集中,以便当用户单击“添加”按钮时,它运行JavaScript,该JavaScript会将新表单(属于表单集的一部分)添加到页面中。 回答1 这就是我使用jQuery的方法: 我的模板: <h3>My Services</h3> {{ serviceFormset.management_form }} {% for form in serviceFormset.forms %} <div class='table'> <table class='no_error'> {{ form.as_table }} </table> </div> {% endfor %} <input type="button" value="Add More" id="add_more"> <script> $('#add_more').click(function() { cloneMore('div.table:last', 'service'); }); </script> 在一个javascript文件中: function cloneMore(selector, type) { var newElement = $(selector).clone(true); var total = $('#id_' + type + '-TOTAL_FORMS')
  • 在WPF MVVM中动态添加控件(Adding controls dynamically in WPF MVVM)
    问题 我正在动态搜索视图中,其中单击按钮应添加一个包含3个组合框和2个文本框的新行。 我应该怎么做呢? 回答1 如果您确实想执行mvvm,请尝试忘记“如何添加控件”。 您不需要,只需考虑一下您的视图模型-WPF为您创建控件:) 就您而言,假设我们有一个SearchViewModel和SearchEntryViewmodel。 public class SearchEntryViewmodel { //Properties for Binding to Combobox and Textbox goes here } public class SearchViewModel { public ObservableCollection<SearchEntryViewmodel> MySearchItems {get;set;} public ICommand AddSearchItem {get;} } 到现在为止,您不必考虑用户控件/视图。 在SearchView ,创建一个ItemsControl并将ItemsSource绑定到MySearchItems 。 <ItemsControl ItemsSource="{Binding MySearchItems}"/> 现在,您将在ItemsControl(just the ToString() atm
  • 在Asp.Net中动态添加的控件(Dynamically added controls in Asp.Net)
    问题 我试图把头包在asp.net上。 我有很长一段时间的php开发人员背景,但是现在我面临着学习asp.net的任务,并且遇到了一些麻烦。 这很可能是因为我正试图将框架强制用于其不适合的用途-所以我想学习如何以“正确的方式”进行操作。 :-) 我的问题是如何在运行时以编程方式向页面添加控件。 据我所知,您需要在page_init中创建控件,否则它们将在下一个PostBack中消失。 但是很多时候,我遇到的问题是我不知道要在page_init中添加哪个控件,因为它取决于以前的PostBack中的值。 一个简单的场景可能是在设计器中添加了下拉控件的表单。 下拉菜单设置为AutoPostBack。 当发生PostBack时,我需要呈现一个或多个依赖于下拉控件中所选值的控件,并且最好使这些控件的行为就像设计中添加的一样(如“发回时,表现为”正确”)。 我在这里走错了路吗? 回答1 我同意这里的其他观点:“如果您可以摆脱动态创建控件的行为,那就去做吧……”(@ Jesper Blad Jenson aka着),但这是我过去使用动态创建控件解决的一个技巧。 问题是鸡肉和鸡蛋。 您需要使用ViewState创建控件树,并且需要创建控件树才能获取ViewState。 好吧,那几乎是正确的。 有一种方法可以在填充树的其余部分获取ViewState值。 那是通过重写LoadViewState(
  • 动态添加的DropDownlists不会触发SelectedIndexChanged事件[重复](Dynamically Added DropDownlists Are Not Firing SelectedIndexChanged Event [duplicate])
    问题 这个问题已经在这里有了答案: 事件不会触发到动态添加的控件(1个答案) 11个月前关闭。 我看到了很多有关此主题的信息,但我找不到解决方法。 我通过一个事件添加了许多下拉列表,但它们并未触发SelectedIndexChanged evet。 这是drplist创建者代码: foreach (var row in cmdSelectCats.ExecuteReader()) { var id = row["ProductCategoryID"].ToString(); var dropDownStatus = new DropDownList {ID = "DrpStatus-" + id}; dropDownStatus.Items.Add(new ListItem("Aktif", "1")); dropDownStatus.Items.Add(new ListItem("Pasif", "2")); dropDownStatus.AutoPostBack = true; dropDownStatus.SelectedIndexChanged += Status_SelectedIndexChanged; var tableCell = new TableCell(); tableCell.Controls.Add(dropDownStatus)
  • Windows窗体中标签的自动换行(Word wrap for a label in Windows Forms)
    问题 如何获得超出范围的文本Label换行功能? 回答1 快速答案:关闭AutoSize。 这里最大的问题是标签不会自动更改其高度(仅更改宽度)。 为了实现此目的,您将需要对标签进行子类化,并包括垂直调整大小逻辑。 基本上,您需要在OnPaint中执行以下操作: 测量文本的高度(Graphics.MeasureString)。 如果标签的高度不等于文本的高度,则设置高度并返回。 绘制文本。 您还需要在构造函数中设置ResizeRedraw样式标志。 回答2 实际上,所接受的答案不必要地复杂。 如果将标签设置为“自动调整大小”,它将随输入的文本自动增长。 (这包括垂直增长。) 如果要使其以特定宽度自动换行,可以设置MaximumSize属性。 myLabel.MaximumSize = new Size(100, 0); myLabel.AutoSize = true; 经过测试和工作。 回答3 在我的情况下(面板上的标签),我设置了label.AutoSize = false和label.Dock = Fill 。 标签文本将自动换行。 回答4 没有自动换行属性,但是可以通过编程来动态调整它的大小。 这是一种解决方案: 选择标签的属性 AutoSize = True MaximumSize =( Width , Height ),其中Width =您希望标签成为的最大尺寸
  • 无法删除控件集合,因为控件包含代码块(即<%…%>)(The Controls collection cannot be modified because the control contains code blocks (i.e. <% … %>))
    问题 我正在尝试在C#中创建动态元标记,但它给出以下错误: 无法修改控件集合,因为控件包含代码块(即<%...%>) 这是我添加的代码: HtmlMeta meta = new HtmlMeta(); meta.Name = "keywords"; meta.Content = "book,paper"; Page.Header.Controls.Add(meta); 非常感谢你。 回答1 很难确定,因为您没有包含很多细节,但是我认为这是怎么回事,您的Page.Header中有<% ... %>代码块(指的是<head runat="server"> -可能在母版页中)。 因此,当您尝试将一个项目添加到该控件的控件集合时,您会在此问题的标题中收到错误消息。 如果我是对的,那么解决方法是将<asp:placeholder runat="server">标记包装在<% ... %>代码块周围。 这使代码块成为Placeholder控件的子级,而不是Page.Header控件的直接子级,但是它根本不会更改呈现的输出。 现在,代码块不再是Page.Header的直接子代,您可以Page.Header地将内容添加到页眉的控件集合中。 同样,在某处有一个代码块,否则您将不会看到此错误。 如果它不在您的aspx页面中,那么我首先要看的是aspx顶部的MasterPageFile属性所引用的文件。