2012-12-17 57 views
0

我在面板上添加了一個usercontrol,並將在usercontrol中的組合框的屬性設置爲public,我想驗證,但我一直點擊它顯示窗體的按鈕。最新問題,如何驗證何時通過按鈕動態添加多個組合框。在驗證布爾條件時出錯

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"); 
    } 
} 
+0

當你動態添加'ComboBox'時,是否填充了'text'屬性? –

+0

yess ofcourse如果組合框被添加到一個usercontrol並設置爲public,那麼它將具有文本屬性。 –

+0

然後,你永遠不會得到'text'值爲空,因爲它總是返回'false'。 –

回答

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); 
} 

這將做同樣的事情。


編輯:看起來像你的ComboBox控制不panel1直接孩子,但某種自定義用戶控件的內部。因此,你需要像

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

所以OfType行現在就挑選出您的自定義用戶控件,Select線把你的用戶控件之一,並發現ComboBoxAny線檢查,如果他們都值。

替代在原有的風格:

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; 
} 
+0

您的解決方案也是在單擊按鈕時打開表單, 表示它不能正常工作, int c = 0; private void button1_Click(object sender,EventArgs e) int {v} v = C++; panel1.VerticalScroll.Value = VerticalScroll。最小; UserControl1 us = new UserControl1(); us.Name =「us」+ v; us.Location = new Point(150,5 +(30 * v)); panel1.Controls.Add(us); } 我通過此代碼添加了用戶控件,這是否可以通過您的代碼進行驗證? –

+1

艾等待。 'panel1.Controls'將返回面板的_immediate_子項,但看起來您的下拉菜單還在。我將編輯我的答案。 – Rawling

+0

先生,它工作正常,但你怎麼知道我使用LINQ? –

2

的問題是,你決定爲每一個組合框的val2值。可能最後一個組合框有一個值,因此將顯示窗體而不是消息框。如果只想在所有組合框具有選定值的情況下,結果爲true,則需要尋找像如下:

假設所有組合框都有選定的值。只要一個沒有值,則返回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"); 

    } 
}