使用对象数据源将参数传递给存储过程

本文关键字:参数传递 存储过程 数据源 对象 | 更新日期: 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_idau_nametitles(的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>