使用ObjectDataSource将参数传递给存储过程

时间:2014-10-03 22:54:37

标签: c# asp.net gridview objectdatasource

我正在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_idau_nametitles)。我将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;
&#13;
&#13;

4 个答案:

答案 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