2011-01-19 17 views
15

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

もしそうでなければ、ラベルをグループ化して、テキストボックスを移動するとラベルを手動で移動する必要がないようにする方法はありますか?

答えて

7

いいえ、少なくともボックス外のコントロールはありません。これを望むなら、ユーザーコントロールでそれを達成することができます。

一般に、winformsはHTMLと同じ方法で行駆動されません。

0

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

詳しい情報Panel Class (System.Windows.Forms)

あなたが(むしろパネルを使用するよりも)コントロールのより高度をしたい場合は、UserControlを作成することができ、LabelControlをカプセル化しています。

1

私は2番目の@Neilsは、その中にテキストボックスを持つユーザーコントロールを作成するだけの答えです。パネルはコントロールをグループ化するために使用できますが、フォームに多くのコントロールがある場合は面倒です。

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

0

私はGroupBoxを使うのが最善の策だと思います。

21

組み込みのものはありません。あなた自身のFieldクラスをロールすることができます。以下は完全な例です。

enter image description here

+0

を使用すると、ラベルをクリックすると、フォーカスがリンクされたテキストボックスに与えられています。デザインモードでも、両方のコントロール(ラベルとテキストボックス)を自由に動かすことができます。私はこれが競争の例であるとは言いません... –

+0

@DangerZone - あなたはパネルでドッキングして、テキストボックスをユーザーコントロールに塗りつぶすことができます。 – user5226582

0

あなたが例に従う、それを行うために拡張メソッドを使用することができます:ここで

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

は例のプログラムは、私のシステムでどのように見えるのです

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

は、これが私の解決策ですTableLayoutPanelを使用してラベルと入力コントロールを配置し、

Presettedいくつかの有用な特性:

  • 垂直整列のためのコンテンツ
  • ラベルマージントップによって自動サイズのラベル:スタイルのようなミドル
  • 塗りつぶしが入力制御

プレビューでスペースをまま

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

Useageラップが必要な場合があり

:アクセスの「フィールドコントロール」で

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(); 
関連する問題