web-dev-qa-db-ja.com

WinForms:ラベルをテキストボックスに関連付ける概念はありますか?

Visual Studio 2010とC#を使用しています。 Windowsフォームの開発で、ラベルをテキストボックスにリンクするという概念はありますか?彼らがユニットとして一緒に動くように何か? ASP.NETの世界には、ラベルコントロールのAssociatedControlIdプロパティがあります。また、MS Accessフォームデザイナがラベルをコントロールに関連付ける(またはリンクする)方法をいくつか持っていることを覚えていると思います。この機能はVisual Studioの世界にも存在しますか?

そうでない場合、テキストボックスを移動した場合に手動でラベルを移動する必要がないように、コントロールを使用してラベルをどのようにグループ化しますか?

21
User

いいえ、ありません-少なくともボックスのコントロールでは。これが必要な場合は、ユーザーコントロールを使用して実現できます。

一般に、winformsはHTMLのように行駆動ではありません。

9
Neil

組み込まれているようには見えません。独自の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

23
dharmatech

@Neilsの2番目の答えは、テキストボックスを含むユーザーコントロールを作成するだけです。パネルはコントロールをグループ化するために使用できますが、フォーム上に多数のコントロールがある場合、かなり退屈な作業になる可能性があります。

テキストボックス以外のものもサポートしたい場合は、WinFormsを使用して独自のデザイナーを作成できます。 ParentControlDesigner クラスからデザイナーを継承する場合、必要なコントロールをカスタムラベルコントロールにドロップできます。

2
Brian

ラベルを他のコントロール(またはグループコントロール一般)とグループ化する場合は、System.Windows.Forms.Panel コントロール。 Panelコントロールの特定の目的は、group collections of controls

詳しくはパネルクラス(System.Windows.Forms)

(Panelを使用するのではなく)より高度な制御が必要な場合は、UserControlLabelをカプセル化するControlを作成できます。

1

これは私の解決策であり、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();
0
IlPADlI

拡張メソッドを使用してそれを行うことができます、例に従ってください:

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
0
Henrique

groupBoxを使用するのが最善の策だと思います。

0
V4Vendetta