这就是我的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个其他项目,一切正常。
答案 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;