html如下:
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="cid">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<table>
<tr>
<td>&nbsp;&nbsp;<%#DataBinder.Eval(Container.DataItem,"cname")%></td>
</tr> <tr>
<td>&nbsp;</td>
         </tr>
<tr><td>
<asp:DataGrid ID="DataGrid2" Runat="server" GridLines="Horizontal" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate> &nbsp;<a href='newsdetails.aspx?nid=<%# DataBinder.Eval(Container.DataItem, "nid") %>' Target="_blank"> <%# DataBinder.Eval(Container.DataItem, "title")%> </a><font style="font-size: 7pt">&nbsp;<%# DataBinder.Eval(Container.DataItem, "addtime", "({0})") %></font> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:DataGrid> </td> </tr> <tr>
<td align="right"><a href='newslist.aspx?cid=<%# DataBinder.Eval(Container.DataItem,"cid") %>'>更多...</a> </td> </tr> </table> </ItemTemplate> </asp:TemplateColumn> </Columns>
</asp:DataGrid>后台代码:
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
DataGrid dg =(DataGrid)e.Item.Cells[0].FindControl("DataGrid2");
//String cid = DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString();(这句是传参数的,发现
// 也有错误,说index越界,后来我把存储过程的参数硬编码进去了,不用这句;                  //以下是调用我写的一些获得数据,调用存储过程的函数,在其他地方用的都没错
DbModule db =new DbModule(connstr);
DataSet dataset = new DataSet();
                          dataset = db.RunProcedure("sp_getNews",new IDataParameter[]{},"mynews_news");
dg.DataSource = dataset.Tables["mynews_news"].DefaultView;
dg.DataBind();出错提示:
未将对象引用设置到对象的实例。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
行 77:  DbModule db =new DbModule(connstr);
行 78:  DataSet dataset = new DataSet();
行 79:  dataset = db.RunProcedure("sp_getNews",new IDataParameter[]{},"mynews_news");
行 80:  dg.DataSource = dataset.Tables["mynews_news"].DefaultView;
行 81:  dg.DataBind();
 


}

解决方案 »

  1.   

    private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    DataGrid dg =(DataGrid)e.Item.FindControl("DataGrid2");
    int cid = Convert.ToInt32(dg.DataKeys[(int)e.Item.ItemIndex]);
    }
      

  2.   

    private void DataGird1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 


    DataGrid dl1 = (DataGrid)e.Item.FindControl("DataGrid2");
    dl1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
    dl1.DataSource =((DataRowView)e.Item.DataItem).CreateChildView("ParentChild");
    dl1.DataBind();
    }
    }
      

  3.   

    dl1.DataSource =((DataRowView)e.Item.DataItem).CreateChildView("ParentChild");
    不好意思啊,这句不理解啊,我如何绑定我上述的数据?
    太感谢了!!!
      

  4.   

    to: betterwy(哇,我心依旧)
    按你这样做可以显示出数据了。但
    int cid = Convert.ToInt32(dg.DataKeys[(int)e.Item.ItemIndex]);
    这句还是出错了,提示:
    索引超出范围。必须为非负值并小于集合大小。参数名: index 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index源错误: 
    行 87:  {
    行 88:  DataGrid dg =(DataGrid)e.Item.FindControl("DataGrid2");
    行 89:  int cid = Convert.ToInt32(dg.DataKeys[(int)e.Item.ItemIndex]);
    行 90:  DbModule db =new DbModule(connstr);
    行 91:  DataSet dataset = new DataSet();
     
    再次感谢你的回复!!
      

  5.   

    对不起搞错了,
    应该是这样:Convert.ToInt32(DataGrid1.DataKeys[(int)e.Item.ItemIndex])
    是第一个DataGrid的DataKey