WinForms:是否存在将标签与文本框相关联的概念?

我正在使用带有C#的Visual Studio 2010。 Windows窗体开发中是否存在以某种方式将标签链接到文本框的概念? 什么东西让他们作为一个整体一起移动? 在ASP.NET世界中,有标签控件的AssociatedControlId属性。 我还认为我记得MS Access表单设计者有一些方法可以将标签与控件相关联(或链接)。 此function是否甚至存在于Visual Studio世界中?

如果没有,如何使用控件对标签进行分组,以便在移动文本框时也不必手动移动标签?

没有 – 至少有开箱即用的控件。 如果你想要这个,你可以通过用户控件实现它。

通常,winforms不像HTML那样以行方式驱动。

似乎没有内置的。 您可以滚动自己的Field类。 以下是一个完整的例子。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace FieldClassTest { class Field : FlowLayoutPanel { public Label label; public TextBox text_box; public Field(string label_text) : base() { AutoSize = true; label = new Label(); label.Text = label_text; label.AutoSize = true; label.Anchor = AnchorStyles.Left; label.TextAlign = ContentAlignment.MiddleLeft; Controls.Add(label); text_box = new TextBox(); Controls.Add(text_box); } } static class Program { [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var form = new Form(); var panel = new FlowLayoutPanel(); panel.FlowDirection = FlowDirection.TopDown; panel.Dock = DockStyle.Fill; var first_name = new Field("First Name"); panel.Controls.Add(first_name); var last_name = new Field("Last Name"); panel.Controls.Add(last_name); form.Controls.Add(panel); Application.Run(form); } } } 

以下是我的系统上示例程序的样子:

在此处输入图像描述

如果要将标签与其他控件(或一般的组控件)分组,请使用System.Windows.Forms.Panel控件。 Panel控件的特定目的是对group collections of controls进行group collections of controls

更多信息 Panel Class(System.Windows.Forms)

如果您想要更高程度的控制(而不是使用Panel),那么您可以创建一个封装LabelControlUserControl

第二个@Neils答案只是创建一个带有文本框的用户控件。 该面板可用于对控件进行分组,但如果表单上有很多控件,则可能非常繁琐。

如果您想支持的不仅仅是文本框,WinForms允许您创建自己的设计器。 如果从ParentControlDesigner类inheritance设计器,则可以将所需的任何控件放入自定义标签控件中。

我认为最好的选择是使用GroupBox。

您可以使用扩展方法来执行此操作,请按照示例操作:

 Private associatedLabels As New Dictionary(Of Control, Label)  Public Sub AssociateLabel(ByVal control As Control, ByVal label As Label) If (Not associatedLabels.ContainsKey(control)) Then associatedLabels.Add(control, label) End If End Sub  Public Function GetAssociatedLabel(ByVal control As Control) As Label If (associatedLabels.ContainsKey(control)) Then Return associatedLabels(control) Else Throw New Exception("There is no associated label") End If End Function 

这是我的解决方案,使用TableLayoutPanel来放置标签和输入控件,

预设了一些有用的属性:

  • 按内容自动标注尺寸
  • 垂直对齐标签边距顶部:中间样式
  • 通过输入控件填充剩余空间

预习

预习

代码可能需要进一步包装

 internal class TextBoxField : TableLayoutPanel { private readonly TextBox _textBox; public string Text { get => _textBox.Text; set => _textBox.Text = value; } public TextBoxField(string labelText) { var label = new Label { Text = labelText, AutoSize = true }; var labelMargin = label.Margin; labelMargin.Top = 8; label.Margin = labelMargin; _textBox = new TextBox { Dock = DockStyle.Fill }; AutoSize = true; ColumnCount = 2; RowCount = 1; ColumnStyles.Add(new ColumnStyle()); ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); RowStyles.Add(new RowStyle()); Controls.Add(label, 0, 0); Controls.Add(_textBox, 1, 0); } } internal class DateTimePickerField : TableLayoutPanel { private readonly DateTimePicker _dateTimePicker; public DateTime Value { get => _dateTimePicker.Value; set => _dateTimePicker.Value = value; } public DateTimePickerField(string labelText) { var label = new Label { Text = labelText, AutoSize = true }; var labelMargin = label.Margin; labelMargin.Top = 8; label.Margin = labelMargin; _dateTimePicker = new DateTimePicker { Dock = DockStyle.Fill }; AutoSize = true; ColumnCount = 2; RowCount = 1; ColumnStyles.Add(new ColumnStyle()); ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); RowStyles.Add(new RowStyle()); Controls.Add(label, 0, 0); Controls.Add(_dateTimePicker, 1, 0); } } 

用途:

 var frm = new Form { AutoSize = true, StartPosition = FormStartPosition.CenterParent, Text = "Assoc Device", }; var txtGpsCode = new TextBoxField("GpsCode") { Dock = DockStyle.Bottom, TabIndex = 1 }; var dtp = new DateTimePickerField("Expire date") { Dock = DockStyle.Bottom, TabIndex = 2 }; var button = new Button { Text = "OK", DialogResult = DialogResult.OK, Dock = DockStyle.Bottom }; frm.Controls.Add(txtGpsCode); frm.Controls.Add(dtp); frm.Controls.Add(button); frm.AcceptButton = button; frm.Height = 0; frm.ShowDialog();