c#无法将'System.Windows.Forms.Label'类型的对象强制转换为'System.Windows.Forms.TextBox'

时间:2013-05-13 14:29:32

标签: c# casting

我无法找到解决此错误的任何内容:/我尝试将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++)
        {

3 个答案:

答案 0 :(得分:19)

foreach (TextBox item in Controls)

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

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

答案 1 :(得分: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++;
        }
    }
}

答案 2 :(得分: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 ...嗯...控件集合的文本框,因此对于集合中的每个CONTROL,这不是TextBox,隐式演员会失败。