无法将类型为“System.Web.UI.WebControls.Label”的对象转换为“System.Web.UI.WebControl”类型

时间:2011-04-07 17:38:17

标签: c# asp.net casting

这就是我的aspx页面:

<asp:TemplateField HeaderText="Detail" HeaderStyle-ForeColor="DimGray" >
  <ItemTemplate>
    <asp:Label ID="labeldetail" runat="server" Text='Label' ></asp:Label>
  </ItemTemplate>
</asp:TemplateField>

在aspx.cs中,向grid添加值:

 public void Addtogrid()
 {
    string ctrlStr = String.Empty;

    foreach (string ctl in Page.Request.Form)
    {  
       if (ctl.Contains("Longitude"))
       {
          ctrlStr = ctl.ToString();
          Disctrict.School[0].Student[j].Activity[k].Sport = Request.Form[ctrlStr];
       }
    }
 }

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
     Label lbl7 = (Label)e.Row.FindControl("labeldetail");
     if (lbl7 != null)
     {
       lbl7.Text =  Disctrict.School[0].Student[j].Activity[[e.Row.RowIndex].Sport ;
     }
   }
 }

 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
 {
    foreach (Control ctrl in ControlsPanel.Controls)
    {
      if (ctrl.ClientID.Contains("Sport"))
      {
        ((TextBox)ctrl).Text = Disctrict.School[0].Student[0].Activity[x].Sport // <--- Getting error here....
      }
    }
 }

我不明白我错过了什么。我在同一个GridView中有16个其他项目,一切正常。

2 个答案:

答案 0 :(得分:1)

看起来您正在迭代的ControlsPanel中包含的控件之一不是TextBox类型。根据您的错误,它似乎是Label类型。

您可以在尝试演员之前检查类型:

if (ctrl is TextBox)
{
   ((TextBox)ctrl).Text = Disctrict.School[0].Student[0].Activity[x].Sport
}
else
{
   // you can do something else, or ignore the control if it is not a text box
}

一般来说,在尝试使用类似的转换之前测试类型是一种好习惯,除非您确定该对象属于您要转换的类型。

我觉得有用的方法有时是as关键字尝试转换对象,然后比较null。这样做会导致变量在对象未实现接口时设置为null,或者无法强制转换为您尝试将其强制转换为的类型。

TextBox txtBox = ctrl as TextBox;   
// now txtBox will either be set to an instance or will be null
if (txtBox != null)
{
    // this means the cast worked..
}

请注意,虽然as关键字可能比显式投射慢,但请始终考虑投射的执行频率以及在何种情况下!

答案 1 :(得分:0)

正如错误所说:您正在尝试将标签转换为文本框,将其更改为:

TextBox txt = (ctrl as TextBox);
if ((ctrl as TextBox) != null)
    (ctrl as TextBox).Text = Disctrict.School[0].Student[0].Activity[x].Sport;
else if ((ctrl as Label) != null)
    (ctrl as Label).Text = Disctrict.School[0].Student[0].Activity[x].Sport;