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

时间:2011-01-19 01:12:17

标签: c# visual-studio winforms textbox label

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

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

7 个答案:

答案 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);
        }
    }
}

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

enter image description here

答案 1 :(得分:9)

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

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

答案 2 :(得分:1)

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

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

如果您想要更高程度的控制(而不是使用Panel),那么您可以创建UserControl,其中包含LabelControl

答案 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放置标签和输入控件

预设了一些有用的属性:

  • 按内容自动调整尺寸标签
  • 标签边距顶部为 vertical-align:middle ,如样式
  • 通过输入控件填充剩余空间

预览

preview

代码可能需要进一步包装

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();