2011-01-19 5 views
15

Uso Visual Studio 2010 con C#. Esiste un concetto nello sviluppo di Windows Form di collegare in qualche modo un'etichetta con una casella di testo? Qualcosa in modo che si muovano insieme come un'unità? Nel mondo ASP.NET, esiste la proprietà AssociatedControlId del controllo etichetta. Penso anche di ricordare che il progettista di moduli di MS Access ha un modo di associare (o collegare) etichette con controlli. Questa funzione esiste persino nel mondo di Visual Studio?WinForms: esiste un concetto di associazione di un'etichetta a una casella di testo?

In caso contrario, come si raggruppano le etichette con i controlli in modo tale che se si sposta una casella di testo non è necessario spostare manualmente anche l'etichetta?

risposta

7

No, non c'è - almeno con i controlli fuori dalla scatola. Se lo vuoi, puoi ottenerlo con un controllo utente.

In generale Winforms non è guidato dalla linea nello stesso modo di HTML.

0

Se si desidera raggruppare le etichette con altri controlli (o controlli di gruppo in generale), utilizzare il controllo System.Windows.Forms.Panel. Lo scopo specifico del controllo Panel è group collections of controls.

Maggiori informazioniPanel Class (System.Windows.Forms)

Se si desidera un più alto grado di controllo (piuttosto che utilizzare un pannello), allora si potrebbe creare una UserControl, che incapsula un Label e Control.

1

I 2nd Risposta @Neils di creare semplicemente un controllo utente con una casella di testo. Il pannello può essere usato per raggruppare i controlli, ma può essere piuttosto noioso se hai molti controlli sul modulo.

Se si desidera supportare più di semplici caselle di testo, WinForms consente di creare il proprio designer. Se erediti il ​​tuo designer dalla classe ParentControlDesigner, puoi disattivare qualsiasi controllo desiderato nel controllo etichetta personalizzata.

0

penso che la soluzione migliore sarebbe utilizzare un GroupBox.

21

Non sembra essere costruito in uno. Puoi tuttavia personalizzare la tua classe Field. Di seguito è riportato un esempio completo.

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

Ecco ciò che il programma di esempio si presenta come sul mio sistema:

enter image description here

+0

Con il "controllo del campo" in materia di accesso, quando si fa clic sull'etichetta l'attenzione viene data alla casella di testo collegato. È anche possibile in modalità progettazione spostare liberamente entrambi i controlli (etichetta e casella di testo). Non dirò che questo è un esempio di concorrenza ... –

+0

@DangerZone - puoi giocare con i pannelli e l'attracco per far sì che la casella di testo riempia il controllo dell'utente. – user5226582

0

È possibile utilizzare metodi di estensione per farlo, seguire l'esempio:

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

Questa è la mia soluzione , utilizzando TableLayoutPanel per posizionare l'etichetta e il controllo di input,

pretarati alcune utili proprietà: etichetta dimensione

  • automatica per contenuto
  • margine superiore
  • Etichetta per vertical-align: middle come stile
  • riempimento rimangono spazio di controllo di ingresso

Preview

preview

Il codice può avere bisogno di ulteriori avvolgere

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

Uso:

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