private void classlist_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
ArticleClass class1 = new ArticleClass();
String id = e.Item.Cells[1].Text;

TextBox dd =(TextBox) e.Item.Cells[1].Controls[0];//这里出问题,错误为“指定的转换无效”
classlist.EditItemIndex = -1;
BindGrid();
}

解决方案 »

  1.   

    TextBox dd = (TextBox)e.Item.FindControls("yourcontrolname")
      

  2.   

    DataGridItem的属性
    ItemIndex —— 得到行在Items中的索引
    ItemType —— 返回行的类型,也就是上面列出的Header、Item、...、Pager
    Cells —— 返回行包含的所有TableCell(不管是显示声明的,还是自动生成的,不管是可以看见的,还是隐藏掉的),通过TableCell,可以读取Cell中显示的文本、包含的控件
    严重注意:只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要将目标控件转换成相应的控件。
    比如:
    假设DataGrid的第一列声明如下
    <asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
    读取的时候可以用:
    //Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一个控件(也只有这个控件可以用)
    HyperLink link = (HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
    Response.Write(link.Text);
    至于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是用FindControl来查找控件。
    FindControl是System.Web.UI.Control的方法,可以根据子控件ID来查找子控件
    比如:
    假设DataGrid的某一列声明如下
    <asp:TemplateColumn>
       <ItemTemplate>
          <asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id") %>'>
          </asp:TextBox>
       </ItemTemplate>
    </asp:TemplateColumn>
    读取方法:
    TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
    Response.Write(txt.Text);
    注意:DataList中是没有Cell的