it-swarm.com.de

WinForms: Gibt es ein Konzept zum Verknüpfen eines Etiketts mit einem Textfeld?

Ich verwende Visual Studio 2010 mit C #. Gibt es in der Windows Forms-Entwicklung das Konzept, eine Beschriftung mit einem Textfeld zu verknüpfen? Etwas so, dass sie sich als Einheit zusammen bewegen? In der ASP.NET-Welt gibt es die AssociatedControlId-Eigenschaft des Label-Steuerelements. Ich denke auch, dass ich mich daran erinnere, dass der MS Access-Formulardesigner Beschriftungen mit Steuerelementen verknüpft (oder verknüpft) hat. Gibt es diese Funktion überhaupt in der Visual Studio-Welt?

Wenn nicht, wie gruppieren Sie Beschriftungen mit Steuerelementen, sodass Sie die Beschriftung beim Verschieben eines Textfelds nicht auch manuell verschieben müssen?

18
User

Nein gibt es nicht - zumindest bei den Out-of-the-Box-Bedienelementen. Wenn Sie dies möchten, können Sie es mit einem Benutzersteuerelement erreichen.

Im Allgemeinen werden WinForms nicht wie HTML zeilengesteuert.

8
Neil

Es scheint keinen eingebauten zu geben. Sie können jedoch Ihre eigene Field Klasse würfeln. Unten finden Sie ein vollständiges Beispiel.

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

So sieht das Beispielprogramm auf meinem System aus:

enter image description here

22
dharmatech

Ich 2. @Neils Antwort nur ein Benutzersteuerelement mit einem Textfeld darin zu erstellen. Das Bedienfeld kann zum Gruppieren von Steuerelementen verwendet werden. Es kann jedoch sehr mühsam sein, wenn das Formular viele Steuerelemente enthält.

Wenn Sie mehr als nur Textfelder unterstützen möchten, können Sie mit WinForms Ihren eigenen Designer erstellen. Wenn Sie Ihren Designer von der Klasse ParentControlDesigner erben, können Sie ein beliebiges Steuerelement in Ihr benutzerdefiniertes Beschriftungssteuerelement einfügen.

1
Brian

Wenn Sie Beschriftungen mit anderen Steuerelementen (oder Gruppensteuerelementen im Allgemeinen) gruppieren möchten, verwenden Sie das Steuerelement System.Windows.Forms.Panel. Der spezielle Zweck des Bedienfelds besteht darin, group collections of controls.

Mehr Informationen Panel-Klasse (System.Windows.Forms)

Wenn Sie ein höheres Maß an Kontrolle wünschen (anstatt ein Panel zu verwenden), können Sie eine UserControl erstellen, die eine Label und eine Control kapselt.

1

Dies ist meine Lösung, die eine TableLayoutPanel verwendet, um Beschriftung und Eingabesteuerung zu platzieren.

Einige nützliche Eigenschaften voreingestellt:

  • Automatische Größenbeschriftung nach Inhalt
  • Beschriftungsrand oben für vertikal ausrichten: Mitte ähnlicher Stil
  • Füllen Sie den verbleibenden Platz mit der Eingabesteuerung

Vorschau

 preview

Der Code muss möglicherweise weiter umgebrochen werden

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

Verwendung:

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

Sie können Erweiterungsmethoden verwenden, um dies zu tun, folgen Sie dem Beispiel:

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

ich denke, die beste Wette wäre die Verwendung einer GroupBox.

0
V4Vendetta