3

我找不到任何可以解决此错误的方法:/ 我正在尝试将 2 个字母组合(例如 aa、ba、cb)作为乘数(aa*3=4*3 ba*2=3,5*2)。我的代码是;

string[] dersler = new string[9];
    double[] kredi = new double[9];
    double[] krediSonuclari = new double[9];

    double derscarp(double s1, double s2)
    {
        return s1 * s2;
    }
    private void button1_Click(object sender, EventArgs e)
    {

        int i=0;
        int j = 0;
        foreach (TextBox item in Controls)
        {
            if (item.Name.Substring(0,7)=="txtders")
            {
                dersler[i] = Convert.ToString(item.Text);
                i++;
            }
        }
        foreach (TextBox item in Controls)
        {
            if (item.Name.Substring(0, 8) == "txtkredi")
            {
                kredi[j] = Convert.ToDouble(item.Text);
                j++;
            }
        }

        double toplam =0;
        for (int k = 0; k < 9; k++)
        {
4

3 回答 3

20
foreach (TextBox item in Controls)

Controls包含一些不是文本框的控件。
您的foreach语句告诉编译器将集合中的每个项目转换为TextBox,这是行不通的。

相反,您可以调用,这将返回仅包含实例.OfType<TextBox>()的集合的过滤子序列。TextBox

于 2013-05-13T14:31:35.187 回答
3

当你这样做时:

foreach (TextBox item in Controls)
{
    if (item.Name.Substring(0,7)=="txtders")
    {
        dersler[i] = Convert.ToString(item.Text);
        i++;
    }
}

您假设表单中的每个控件都是一个文本框,这可能不是真的。因此,它将尝试将您的 Label 控件转换为 TextBox,失败并引发错误。

试试这个:

foreach (Control ctrl in Controls)
{
    TextBox item = ctrl as TextBox;
    if (item != null) 
    {
        if (item.Name.Substring(0,7)=="txtders")
        {
            dersler[i] = Convert.ToString(item.Text);
            i++;
        }
    }
}
于 2013-05-13T14:32:07.893 回答
2

代替

foreach (TextBox item in Controls) //implicit cast.

}

 foreach (Control ctrl in Controls)
     if (ctrl is TextBox){
         TextBox tb = (Textbox)ctrl; //explicit cast
     }
 }

foreach 不会自动挑选出 cherr ... ehm ... Control 集合的文本框,因此对于集合中的每个 CONTROL,这不是 TextBox,隐式转换将失败。

于 2013-05-13T14:32:10.570 回答