Visual Studio 2010とC#を使用しています。 Windowsフォームの開発で、ラベルをテキストボックスにリンクするという概念はありますか?彼らがユニットとして一緒に動くように何か? ASP.NETの世界には、ラベルコントロールのAssociatedControlIdプロパティがあります。また、MS Accessフォームデザイナがラベルをコントロールに関連付ける(またはリンクする)方法をいくつか持っていることを覚えていると思います。この機能はVisual Studioの世界にも存在しますか?
そうでない場合、テキストボックスを移動した場合に手動でラベルを移動する必要がないように、コントロールを使用してラベルをどのようにグループ化しますか?
いいえ、ありません-少なくともボックスのコントロールでは。これが必要な場合は、ユーザーコントロールを使用して実現できます。
一般に、winformsはHTMLのように行駆動ではありません。
組み込まれているようには見えません。独自の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);
}
}
}
私のシステムでのサンプルプログラムは次のようになります。
@Neilsの2番目の答えは、テキストボックスを含むユーザーコントロールを作成するだけです。パネルはコントロールをグループ化するために使用できますが、フォーム上に多数のコントロールがある場合、かなり退屈な作業になる可能性があります。
テキストボックス以外のものもサポートしたい場合は、WinFormsを使用して独自のデザイナーを作成できます。 ParentControlDesigner クラスからデザイナーを継承する場合、必要なコントロールをカスタムラベルコントロールにドロップできます。
ラベルを他のコントロール(またはグループコントロール一般)とグループ化する場合は、System.Windows.Forms.Panel
コントロール。 Panelコントロールの特定の目的は、group collections of controls
。
詳しくはパネルクラス(System.Windows.Forms)
(Panelを使用するのではなく)より高度な制御が必要な場合は、UserControl
とLabel
をカプセル化するControl
を作成できます。
これは私の解決策であり、TableLayoutPanel
を使用してラベルと入力コントロールを配置し、
いくつかの有用なプロパティを事前設定しました:
プレビュー
コードはさらにラップが必要な場合があります
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();
拡張メソッドを使用してそれを行うことができます、例に従ってください:
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
groupBoxを使用するのが最善の策だと思います。