使用对象数据源将参数传递给存储过程
本文关键字:参数传递 存储过程 数据源 对象 | 更新日期: 2023-09-27 18:25:34
我正在Visual Studio 2013上做一个简单的关于图书库的项目。我有一个数据库,我将从中获取GridView
的信息。
此页面的目的是显示作者列表及其各自的标题。
所以,基本上,我有一个GridView
,它将显示作者的姓名和ID。我在末尾添加了一列并将其编辑为模板,以便我可以包含另一个GridView
- 这个将在第一个GridView
中包含相应作者的书名。
第一个GridView
连接到第一个ObjectDataSource
,该将调用函数GetData()
(这将返回要在GridView
上显示的正确表(。第二个GridView
连接到第二个ObjectDataSource
,该将调用函数GetTitlesByAuthor()
。但是,此函数接收一个参数:au_id
(author_ID(。
我的问题是:如何根据前GridView
行上显示的au_id
的值传递参数au_id
?
编辑:为了更清楚:
我有一个 3 列(au_id
、au_name
、titles
(的GridView
。我将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>
然后是嵌套的网格视图。我还没有在对象数据源上做过工作,但据我所知,你有一个主网格,你想在子网格中传递作者 ID wuch 显示书籍。
我会这样做的方式。
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) { }
}
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 中删除数据源属性,在 rowDataBound 事件中动态设置该属性,然后像@coder001一样调用 DataBind 。
这是msdn中描述的很好的方法,您可以查看对象数据参数。
我不想更改 c# 代码。因此,为了实现我的目标,我在嵌套GridView
旁边添加了一个不可见的Label
,将其绑定到au_id
,然后配置ObjectDataSource
以从Label
获取参数。
生成的代码如下:
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataKeyNames="au_id" DataSourceID="ObjectDataSource1" AllowPaging="True">
<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:Label ID="Label1" runat="server" Text='<%# Eval("au_id", "{0}") %>' Visible="False"></asp:Label>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="ObjectDataSource2" ForeColor="#333333" GridLines="None" ShowHeader="False" BackColor="Transparent" 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" ConvertEmptyStringToNull="False" />
</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:ControlParameter ControlID="Label1" Name="au_id" PropertyName="Text" 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="#333333" 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>