才用的是Oracle表, 表名:PIC_USER ,表中只有两个字段,即 USERNAME(是主键) 和PASSWORD 。
我在DataGrid中加了《编辑》 和 《删除》两个模板列(即:col[0]为编辑,col[1]为删除,col[2]为USERNAME,col[3]为PASSWORD )。事件处理代码如下: 
private void Datagrid2_UpdateCommand(object source, DataGridCommandEventArgs e)
{
   oracleConnection1.Open();
   string key = Datagrid2.DataKeys[e.Item.ItemIndex].ToString();
   string UserName;
   string Password;
   TextBox tb;
   tb = (TextBox)e.Item.Cells[2].Controls[0]; 
   UserName = tb.Text;
   tb = (TextBox)e.Item.Cells[3].Controls[0];
   Password = tb.Text;
   DataSet1.PIC_USERRow r = dataSet11.PIC_USER.FindByUSERNAME(key);
   r.USERNAME = UserName;
   r.PASSWORD = Password;
   oracleDataAdapter1.Update(dataSet11,"PIC_USER");
   oracleDataAdapter1.Fill(dataSet11);
   Datagrid2.EditItemIndex=-1;
   Datagrid2.DataBind();
   oracleConnection1.Close();
   Datagrid2.Columns[0].HeaderText="已更新";
}
数据修改完后点击更新就出现《指定的转换无效》的错误。
出错行是:tb = (TextBox)e.Item.Cells[2].Controls[0]; 请大侠们分析一下出错原因,并指出解决方法,万分感谢!

解决方案 »

  1.   


    TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
      

  2.   

    tb = (TextBox)e.Item.Cells[2].Controls[1];
      

  3.   

    模版列中第0个controls是空白,你加入的控件号依次是1,3,5,...
      

  4.   

    TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");这样可以!
      

  5.   

    FindControl好像只针对自定义模版列才有用吧..
    个人估计HeaderText可能改不起来搂住可以在前台页面里定义一个<div id="update" runat="server" />
    然后Datagrid2.Columns[0].HeaderText="已更新";
    改为update.Text =" 已更新";
    这样就可以了
      

  6.   

    .FindControl("txtID");中的txtID 指的是列名吗?
      

  7.   

    很有可能是Controls[0]的索引出错...你把(TextBox)后面的加个括号括起来试试
    tb = (TextBox)e.Item.Cells[2].Controls[0];—>
    tb = (TextBox)(e.Item.Cells[2].Controls[0]);
      

  8.   

    to: jcchou(湘霸佬) 
    试了还是那样。
      

  9.   

    TextBox tb;
       tb = (TextBox)e.Item.findcontrol("编辑用户名的编辑框的ID");
       UserName = tb.Text;
       tb = (TextBox)e.Item.findcontrol("编辑密码的编辑框的ID");
       Password = tb.Text;
      

  10.   

    自动生成的列,Controls方法是找不到的,寻找控件的好方法就是findcontrol
      

  11.   

    看看你datagrid的定义中第3,4列Cells[2]和Cells[3]是不是textbox类型的??
    如果datagrid中textbox定义都没有id的话,用findcontrol也是白搭!!
      

  12.   

    在datagrid的定义中Cells[2]和Cells[3]是textbox类型的,但没有ID, 是否要手动添加ID呀?
    <asp:TextBox runat="server" Text='<%# DataBinder.EvalContainer, "DataItem.USERNAME") %>'>
    <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.PASSWORD") %>'>
      

  13.   

    试一下:tb = (TextBox)e.Item.Cells[2].FindControl("ID")
    如果没有ID就添加一个,如果使用索引访问你不能确定Controls[0]一定是TextBox可能是一个Literl,除非使用遍历Controls集合的方式找到类型为TextBox的控件再做转换使用,不过这个不如你添加一个ID简单!
      

  14.   

    我添加了ID,如:
    <asp:TextBox runat="server" ID="tb1" Text='<%# DataBinder.Eval(Container, "DataItem.USERNAME") %>'>
    <asp:TextBox runat="server" ID="tb2" Text='<%# DataBinder.Eval(Container, "DataItem.PASSWORD") %>'>
    然后在事件处理程序里采用了FindControl, 如:
    tb = (TextBox)e.Item.FindControl("tb1");
    UserName = tb.Text;
    tb = (TextBox)e.Item.FindControl("tb2");
    Password= tb.Text;
    之后不出错,但数据没有更新上,数据还是保持原样,这是怎么回事?
      

  15.   

    这样转换肯定不行了,上面都说了, 用findcontrol(id) 找到了再转换