3

、、などのForm複数の異なるコントロールを使用しています。これらのコントロールをループしながら、これらのコントロールから値を取得する一般的な方法を探しています。ComboBoxTextBoxCheckBox

たとえば、次のようなものです。

foreach(Control control in controls)
{
    values.Add(control.Value);
}

controlそれぞれを別々に扱うことは可能ですか、それとも必要ですか?

4

2 に答える 2

2

すべての 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);
        }
于 2012-06-14T13:30:38.530 に答える
2

これを試して:

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
}
于 2012-06-14T13:06:24.943 に答える