、、などのForm
複数の異なるコントロールを使用しています。これらのコントロールをループしながら、これらのコントロールから値を取得する一般的な方法を探しています。ComboBox
TextBox
CheckBox
たとえば、次のようなものです。
foreach(Control control in controls)
{
values.Add(control.Value);
}
control
それぞれを別々に扱うことは可能ですか、それとも必要ですか?
すべての Control が TextBox の場合、Text ソリューションは問題ありませんが、Label がある場合は、コードを if で埋めない限り、値の中にラベルのテキストが表示されます。より良い解決策は、コントロールの種類ごとに値と見なされるもの (たとえば、TextBox の Text と CheckBox の Checked) を返すデリゲートのセットを定義し、それらを辞書に入れ、それらを使用して値を取得することです。各コントロール。コードは次のようになります。
public delegate object GetControlValue(Control aCtrl);
private static Dictionary<Type, GetControlValue> _valDelegates;
public static Dictionary<Type, GetControlValue> ValDelegates
{
get
{
if (_valDelegates == null)
InitializeValDelegates();
return _valDelegates;
}
}
private static void InitializeValDelegates()
{
_valDelegates = new Dictionary<Type, GetControlValue>();
_valDelegates[typeof(TextBox)] = new GetControlValue(delegate(Control aCtrl)
{
return ((TextBox)aCtrl).Text;
});
_valDelegates[typeof(CheckBox)] = new GetControlValue(delegate(Control aCtrl)
{
return ((CheckBox)aCtrl).Checked;
});
// ... other controls
}
public static object GetValue(Control aCtrl)
{
GetControlValue aDel;
if (ValDelegates.TryGetValue(aCtrl.GetType(), out aDel))
return aDel(aCtrl);
else
return null;
}
次に、次のように記述できます。
foreach (Control aCtrl in Controls)
{
object aVal = GetValue(aCtrl);
if (aVal != null)
values.Add(aVal);
}
これを試して:
Panel myPanel = this.Panel1;
List<string> values = new List<string>();
foreach (Control control in myPanel.Controls)
{
values.Add(control.Text);
}
ただし、必要なコントロールのみを取得するようにしてください。と同じようにタイプを確認できます
if(control is ComboBox)
{
// Do something
}