我正在Visual Studio 2013上做一个关于图书馆的简单项目。
我有一个数据库,我将从中获取GridView
的信息。
此页面的目的是显示作者列表及其各自的标题。
所以,基本上,我有一个GridView
,它会显示作者的姓名和ID。
我在最后添加了一个列并将其编辑为模板,因此我可以添加另一个GridView
- 这个将包含第一个GridView
中相应作者的书名。
第一个GridView
连接到第一个ObjectDataSource
,它将调用函数GetData()
(它将返回要在GridView
上显示的右表)。
第二个GridView
连接到第二个ObjectDataSource
,它将调用函数GetTitlesByAuthor()
。 但是,此函数接收一个参数:au_id
(author_ID)。
我的问题是:如何根据第一个au_id
行上显示的au_id
的值传递参数GridView
?
编辑:更清楚:
我的GridView
有3列(au_id
,au_name
,titles
)。我将titles
字段设置为模板,以便在ItemTemplate
部分插入网格视图。 GridView
只会包含一个包含特定au_id
所有标题的列(取决于排名GridView
行的au_id
值。我的问题是获取该值以发送到包含标题列表的第二个ObjectDataSource
。
所以我的决赛桌将是这样的:
au_id au_name titles
--------------------------
1 Gary A Book Title
Another Book I Wrote
2 Sarah Cooking book
Tech Book
... and so on ...
这是我目前的代码:
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataKeyNames="au_id" DataSourceID="ObjectDataSource1">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="au_id" HeaderText="Author ID" ReadOnly="True" SortExpression="au_id" />
<asp:BoundField DataField="au_lname" HeaderText="LastName" SortExpression="au_lname" />
<asp:BoundField DataField="au_fname" HeaderText="FirstName" SortExpression="au_fname" />
<asp:TemplateField HeaderText="Titles">
<ItemTemplate>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="ObjectDataSource2" ForeColor="#333333" GridLines="None" ShowHeader="False" DataKeyNames="au_id">
<AlternatingRowStyle BackColor="Transparent" />
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl="~/Images/bullet.png" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
</Columns>
<EditRowStyle BackColor="#7C6F57" />
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="Transparent" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F8FAFA" />
<SortedAscendingHeaderStyle BackColor="#246B61" />
<SortedDescendingCellStyle BackColor="#D4DFE1" />
<SortedDescendingHeaderStyle BackColor="#15524A" />
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetTitlesByAuthor" TypeName="MyStore.DataSet1TableAdapters.AuthorTitlesTableAdapter">
<SelectParameters>
<asp:Parameter DefaultValue="409-56-7008" Name="author_ID" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EditRowStyle BackColor="#7C6F57" />
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#E3EAEB" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F8FAFA" />
<SortedAscendingHeaderStyle BackColor="#246B61" />
<SortedDescendingCellStyle BackColor="#D4DFE1" />
<SortedDescendingHeaderStyle BackColor="#15524A" />
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" TypeName="MyStore.DataSet1TableAdapters.AuthorsTableAdapter"></asp:ObjectDataSource>
&#13;
答案 0 :(得分:1)
哦,那就是嵌套的gridview。我还没有完成对objectdatasource的工作,但据我所知你有一个主网格,你想在子网格中传递作者ID,而这些网格显示书籍。
我会这样做..
protected void GVAuthor_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label lblauthid= (Label)e.Row.FindControl("lblCustomerID");//I dont know what is your grid source aspx so assuming it as label.
GridView GvBook = (GridView)e.Row.FindControl("GvBook");
bindChildGridview(Convert.ToInt32(lblauthid.Text), GvBook); //Bind the child gridview here ..
}
}
private void bindChildGridview(int authorId, GridView ChildGridview)
{
try
{
Get datasource based on authorId
ChildGridview.DataSource = <<Your Datasource>>; // Set DataSource Here
ChildGridview.DataBind();
}
catch (Exception) { }
}
答案 1 :(得分:1)
ObjectDataSources的Select参数存储在InputParameters数组中。因此,需要将行中作者ID的值添加到此数组中。
试试这个:
protected void GVAuthor_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var authorId = e.Row.DataItem("au_id");
var ods = e.Row.FindControl("ObjectDataSource2") as ObjectDataSource;
ods.InputParamenters["author_ID"] = authorId;
}
}
您还可能需要在aspx页面中删除GridView2中的DataSource属性,在rowDataBound事件中动态设置它,然后在@ coder001中调用DataBind。
答案 2 :(得分:0)
这是msdn中描述的很好的方法,你可以看看objectdatasouce parameter。
答案 3 :(得分:0)
我不想改变c#代码。
因此,为了实现我的目标,我在嵌套的Label
旁边添加了一个不可见的GridView
,将其绑定到au_id
,然后配置ObjectDataSource
以从{{{}获取参数1}}。
结果代码如下:
Label