我正在使用带有C#的Visual Studio 2010。在Windows窗体开发中是否存在以某种方式将标签链接到文本框的概念?什么东西让他们作为一个整体一起移动?在ASP.NET世界中,有标签控件的AssociatedControlId属性。我还认为我记得MS Access表单设计者有一些方法可以将标签与控件相关联(或链接)。此功能是否甚至存在于Visual Studio世界中?
如果没有,如何使用控件对标签进行分组,以便在移动文本框时也不必手动移动标签?
答案 0 :(得分:22)
似乎没有内置的。你可以推出自己的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);
}
}
}
以下是我的系统上示例程序的样子:
答案 1 :(得分:9)
没有 - 至少有开箱即用的控件。如果你想要这个,你可以通过用户控件实现它。
通常,winforms不像HTML那样以行方式驱动。
答案 2 :(得分:1)
如果要将标签与其他控件(或一般的组控件)分组,请使用System.Windows.Forms.Panel
控件。 Panel控件的具体目的是group collections of controls
。
更多信息 Panel Class (System.Windows.Forms)
如果您想要更高程度的控制(而不是使用Panel),那么您可以创建UserControl
,其中包含Label
和Control
。
答案 3 :(得分:1)
我的第二个@Neils答案只是创建一个带有文本框的用户控件。该面板可用于对控件进行分组,但如果表单上有很多控件,则可能非常繁琐。
如果您想支持的不仅仅是文本框,WinForms允许您创建自己的设计器。如果从ParentControlDesigner类继承设计器,则可以将所需的任何控件放入自定义标签控件中。
答案 4 :(得分:0)
我认为最好的选择是使用GroupBox。
答案 5 :(得分:0)
您可以使用扩展方法来执行此操作,请按照示例:
Private associatedLabels As New Dictionary(Of Control, Label)
<Extension()>
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
<Extension()>
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
答案 6 :(得分:0)
这是我的解决方案,使用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();