3

多数のコントロールに値が含まれているかどうか、またはそれらが空白のままになっていないかどうかを確認する必要があります。

私はこのようなことをしたいと思っていました:

public static bool IsObjectEmpty(Control ctrlThis)
    {
        switch (ctrlThis)
        {
            case ctrlThis is TextBox:
                TextBox txtThis = (TextBox)ctrlThis;
                if (txtThis.Text == "" || txtThis.Text == null)
                { return false; }
                break;

            case (ctrlThis is ComboBox):
                ComboBox cboThis = (ComboBox)ctrlThis;
                if (cboThis.SelectedValue == -1)
                { return false; }
                break;

            case (ctrlThis is NumericUpDown):
                NumericUpDown numThis = (NumericUpDown)ctrlThis;
                if (numThis.Value == 0)
                { return false; }
                break;

            etc etc...

しかし、これはコンパイルされません:

 Error  3   A switch expression or case label must be a bool, char, string,    
 integral, enum, or corresponding nullable type

switch ステートメントでこれを行う方法はありますか、それとも if / else if を大量に実行する必要がありますか? Google と StackOverflow の検索は、あまり役に立ちませんでした。

4

5 に答える 5

2

タイプに基づく条件 (if/switch) は、ほとんどの場合、悪い考えです。

このアプローチはどうですか:

public static bool IsObjectEmpty(TextBox ctrlThis)
{
    if (ctrlThis.Text == "" || ctrlThis.Text == null) {
        return false;
    }

    etc etc...
}            

public static bool IsObjectEmpty(ComboBox ctrlThis)
{
    if (ctrlThis.SelectedValue == -1) {
        return false;
    }

    etc etc...
}            

public static bool IsObjectEmpty(NumericUpDown ctrlThis)
{
    if (ctrlThis.Value == 0) {
        return false;
    }

    etc etc...
}
于 2013-01-07T07:32:10.303 に答える
2

Caseラベルには定数式のみを含めることができます。

したがって、あなたの答えは const 式ではありません。

評価値です。

できない分だけ

public const int a=Enumerable.Range(0,2).First();

スイッチケースの前にそれらの値を計算できます

それらを値と比較します。

何かのようなもの

var t=(ctrlThis is ComboBox)

...
...

switch ( t) ...

case  true :...

編集:CLS から

switch-label:
    case constant-expression :
    default :

コンパイラが悲鳴を上げるようにしないと:

定数値が期待されます

例 :

switch (myInt)
{
case (2+Enumerable.Range(0,2).First()):
    return true;
    default:
    return true;
}
于 2013-01-04T12:16:08.903 に答える
1

次のようなifステートメントも使用できます。

    public static bool IsObjectEmpty(Control ctrlThis)
    {
        if (ctrlThis is TextBox)
        {
            TextBox txtThis = (TextBox)ctrlThis;
            if (txtThis.Text == "" || txtThis.Text == null)
                return false;
        }
        else if (ctrlThis is ComboBox)
        {
            ComboBox cboThis = (ComboBox)ctrlThis;
            if (int.Parse(cboThis.SelectedValue.ToString()) == -1)
                return false;
        }
        else if (ctrlThis is NumericUpDown)
        {
            NumericUpDown numThis = (NumericUpDown)ctrlThis;
            if (numThis.Value == 0)
                return false;
        }
        else
        {
            //Serves as 'default' in the switch
        }
        return true;
    }
于 2013-01-07T15:07:43.963 に答える
1

できるよ:

switch (ctrlThis.GetType().ToString())
{
    case "System.Windows.Forms.TextBox" :
            TextBox txtThis = (TextBox)ctrlThis;
                if (txtThis.Text == "" || txtThis.Text == null)
                { return false; }
                break;
}
于 2013-01-04T12:19:34.983 に答える
0

私が知る限り、あなたはこのようにすることができます

public static bool IsObjectEmpty(Control ctrlThis)
{
    Type t = ctrlThis.GetType();
    switch (t)
    {
        case typeof(TextBox):
            TextBox txtThis = (TextBox)ctrlThis;
            if (txtThis.Text == "" || txtThis.Text == null)
            { return false; }
            break;
    }
}
于 2013-01-07T14:50:29.740 に答える