0

パネルにユーザーコントロールを追加し、ユーザーコントロールにあるコンボボックスのプロパティをパブリックに設定しました。それを検証したいのですが、ボタンをクリックするとフォームが表示されます。問題は、ボタンで複数のコンボボックスを動的に追加したときに検証する方法です。

bool tat;
public bool val2()
{
    foreach (Control item in panel1.Controls.OfType<ComboBox>())
    {
        if (item.Text == string.Empty)
        {
            tat = true;
        }
        else
        {
            tat = false;
        }
    }

    return tat;
}

private void button2_Click(object sender, EventArgs e)
{
    bool valo = val2();

    if (!valo)
    {
        Form4 fp = new Form4();
        fp.Show();
    }
    else
    {
        MessageBox.Show("error");
    }
}
4

2 に答える 2

4

あなたがしていることは、ループを介して毎回の値を上書きすることです。tat

ComboBox1    "Hello"   tat = false
ComboBox2    Empty     tat = true
ComboBox3    "World"   tat = false again!
             Return:   false

コンボ ボックスが空の場合はtrue を返したいと思います。次のように関数を変更できます。

public bool val2()
{
    foreach (Control item in panel1.Controls.OfType<ComboBox>())
    {
        if (item.Text == string.Empty)
        {
            // We know one is empty so we must return true.
            return true;
        }
    }
    // We know none are empty so we can return false.
    return false;
}

または、既に LINQ を使用しているので、次を使用できます。

public bool val2()
{
    return panel1.Controls.OfType<ComboBox>().Any(cb => cb.Text == String.Empty);
}

これはまったく同じことを行います。


編集:あなたのコントロールはの直接の子ではなく、ある種のカスタム ユーザー コントロールの中にあるように見えます。したがって、次のようなものが必要になりますComboBoxpanel1

return panel1.Controls
    .OfType<YourCustomUserControlType>()
    .Select(uc => uc.NameOfYourComboBox)
    .Any(cb => cb.Text == String.Empty);

そのため、OfType行はカスタム ユーザー コントロールを選択し、ユーザー コントロールのSelect1 つを取得して を見つけ、ComboBoxすべてAnyに値があるかどうかをチェックします。

元のスタイルの代替:

public bool val2()
{
    foreach (YourCustomUserControlType item in 
        panel1.Controls.OfType<YourCustomUserControlType>())
    {
        ComboBox cb = item.NameOfYourComboBox;
        if (cb.Text == string.Empty)
        {
            // We know one is empty so we must return true.
            return true;
        }
    }
    // We know none are empty so we can return false.
    return false;
}
于 2012-12-17T08:42:49.603 に答える
2

問題は、val2すべてのコンボ ボックスの値を決定していることです。おそらく、最後のコンボ ボックスに値があるため、メッセージ ボックスの代わりにフォームが表示されます。すべてのtrueコンボ ボックスに値が選択されている場合にのみ結果が表示されるようにする場合は、次のようなソリューションを使用する必要があります。

すべてのコンボ ボックスに値が選択されているとします。1 つだけ 値がない場合は、すぐにtrue; を返します。

public bool val2()
{
    foreach (Control item in panel1.Controls.OfType<ComboBox>())
    {
        if (String.IsNullOrEmpty(item.Text))
            return true;
    }
    return false;
}


private void button2_Click(object sender, EventArgs e)
{

    bool valo = val2();

    if (!valo)
    {
        Form4 fp = new Form4();
        fp.Show();
    }
    else
    {
        MessageBox.Show("error");

    }
}
于 2012-12-17T08:47:10.020 に答える