html如下:
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="cid">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<table>
<tr>
<td> <%#DataBinder.Eval(Container.DataItem,"cname")%></td>
</tr> <tr>
<td> </td>
</tr>
<tr><td>
<asp:DataGrid ID="DataGrid2" Runat="server" GridLines="Horizontal" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate> <a href='newsdetails.aspx?nid=<%# DataBinder.Eval(Container.DataItem, "nid") %>' Target="_blank"> <%# DataBinder.Eval(Container.DataItem, "title")%> </a><font style="font-size: 7pt"> <%# 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();
}
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="cid">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<table>
<tr>
<td> <%#DataBinder.Eval(Container.DataItem,"cname")%></td>
</tr> <tr>
<td> </td>
</tr>
<tr><td>
<asp:DataGrid ID="DataGrid2" Runat="server" GridLines="Horizontal" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate> <a href='newsdetails.aspx?nid=<%# DataBinder.Eval(Container.DataItem, "nid") %>' Target="_blank"> <%# DataBinder.Eval(Container.DataItem, "title")%> </a><font style="font-size: 7pt"> <%# 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();
}
{
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]);
}
{
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();
}
}
不好意思啊,这句不理解啊,我如何绑定我上述的数据?
太感谢了!!!
按你这样做可以显示出数据了。但
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();
再次感谢你的回复!!
应该是这样:Convert.ToInt32(DataGrid1.DataKeys[(int)e.Item.ItemIndex])
是第一个DataGrid的DataKey