你的onitemdatabound事件没有参数的吗?
应该是databind()先执行。

解决方案 »

  1.   

    先执行DataBind()再执行OnItemDataBound事件;
    你所出的错误是因为第一次执行时当时的行不是第一行,要加入如下语句:
    if(e.Item.ItemIndex >= 0)
    {
    //你的语句
    }
      

  2.   

    感谢以上两位:
    事实上我的MyDataBound(....)里是有参数的。
    to shuncy(天才笨蛋):
    如果是DataGrid1.DataBiund()先运行,MyDataBound在后,我便可以得到:
    str=((TextBox)DataGrid1.Item[0].Cells[0].Control[1]).Text;且无须加上if(e.Item.ItemIndex>=0)这个条件呀?事实上,我加了后,错误同上。
      

  3.   

    当我们设置了datagrid的datasource属性,就调用datagrid的databind()方法,把数据源绑定到datagrid上,这时就触发了databinding事件
        完成数据绑定后,这时就触发了itemdatabound事件,在itemdatabound事件里,提供了我们访问datagrid的数据源的最后的机会,在itemcreated和itemdatabound事件里,我们可以通过(DataRowView)(e.Item .DataItem),把e.Item..DataItem强制转换成DataRowView对象,然后我们就可以访问该数据源了
      

  4.   

    怕是你的control的数组的索引值有问题。Controls[0]表示Cell中的第一个控件,你的是第二个控件吗?
    如果是ItemDataBound事件里的话datagrid.item不是一个数组。如下
    String str=((TextBox)DataGrid1.Item.Cells[0].Control[1]).Text;
      

  5.   

    to:babytong(你是天上乌鸦飞啊飞|我是地上黄狗追呀)  你的名字很顺口。
    ((TextBox)DataGrid.Item.Cells[0].Control[1]).Text,能成立吗?
    好像没有Item属性吧,只有Items.
      

  6.   

    你的OnItemDataBound事件是自己写的还是系统中的???错误是在那一行?贴下你的代码吧!出错的地方.
      

  7.   

    请大家一同解决:好像我有理由先运行OnItemDataBound事件:
    代码如下:
    html:
    <asp:datagrid id="DataGrid" ....  OnItemDataBound="MyDataBound">
    <Columns>
        <asp:TemplateColumn> <ItemTemplate> <asp:TextBox Width="59" BorderWidth="0" Runat="server" ID="box1" Text='<%# DataBinder.Eval(Container.DataItem,"stor_id")%>' onkeydown="test()">
    </asp:TextBox>
    </ItemTemplate>
        </asp:TemplateColumn> <asp:TemplateColumn> <ItemTemplate> <asp:TextBox Width="156px" BorderWidth="0" Runat="server" ID="box2" Text='<%# DataBinder.Eval(Container.DataItem,"stor_address")%>' onkeydown="test()"> </asp:TextBox> </ItemTemplate> </asp:TemplateColumn> <asp:TemplateColumn> <ItemTemplate> <asp:TextBox Width="165px" BorderWidth="0" Runat="server" ID="box3" Text="0" onkeydown="test()" ReadOnly="True"></asp:TextBox> </ItemTemplate> </asp:TemplateColumn> </Columns>
    </asp:datagrid>cs:
    public void DataBoundHello(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
                          for(int i=0;i<dt.rows.count;i++)
                          {
                        //报错的原因是下面一条语句:
                            count+=int.parse(((TextBox)this.DataGrid1.Items[i].Cells[2].Controls[1]).Text);
          }
                          this.TextBox_total.Text=count.tostring();
    }
      

  8.   

    对不起:以上cs方法名应为;MyDataBound(....);下面我来证明一下:为什么会先运行OnItemDataBound事件,再执行DataBind()
    在page_load()下加入如下代码:
    if(!IsPostBack)
    {
       this.DataGrid1.DataSource=dt;
       this.DataGrid1.DataBind();
       Response.write("This is DataBind");
    }
    在MyDataBound(....)中写下如下代码:
    {
       Response.write("This is DataBound");
    }
    运行,我们会发现输出如下:
    This is DataBound
    This is DataBound
    This is DataBound
    ...
    This is DataBind
    由上可知:
    DataBind()方法在DataBound之后执行,这也是为什么我在下面取不到数据的原因。
    string str=((TextBox)this.DataGrid1.Items[i].Cells[2].Controls[1]).Text;
      

  9.   

    你的这句
    string str=((TextBox)this.DataGrid1.Items[i].Cells[2].Controls[1]).Text;
    应该写成:
    string str=DataBinder.Eval(e.Item.DataItem,"要取的字段名");我认为OnItemDataBound事件是由DataBind()来触发的,即先执行DataBind()再引发OnItemDataBound事件(个人意见)