【问题标题】:Pass a Parameter to a Stored Procedure using ObjectDataSource使用 ObjectDataSource 将参数传递给存储过程
【发布时间】:2014-10-03 22:54:36
【问题描述】:

我正在 Visual Studio 2013 上做一个关于图书库的简单项目。 我有一个数据库,可以从中获取GridView 的信息。

此页面的目的是显示作者列表及其各自的标题。

所以,基本上,我有一个GridView,它将显示作者的姓名和 ID。 我在末尾添加了一列并将其编辑为模板,因此我可以包含另一个 GridView - 这将包含第一个 GridView 中相应作者的书名。

第一个GridView 连接到第一个ObjectDataSource,它将调用函数GetData()(它将返回要在GridView 上显示的正确表格)。 第二个GridView 连接到第二个ObjectDataSource,它将调用函数GetTitlesByAuthor()但是,这个函数接收一个参数:au_id (author_ID)。

我的问题是:如何根据第一行GridView 上显示的au_id 的值传递参数au_id

编辑:更清楚:

我有一个GridView,有 3 列(au_idau_nametitles)。我将titles 字段设置为模板,这样我就可以在ItemTemplate 部分插入一个gridview。 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>

【问题讨论】:

标签: c# asp.net gridview objectdatasource


【解决方案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) { }
    }

【讨论】:

    【解决方案2】:

    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。

    【讨论】:

      【解决方案3】:

      这是 msdn 中描述的不错的方法,您可以查看 objectdatasouce parameter

      【讨论】:

      • 您提供给我的链接没有帮助。我有一个带有 3 列的 GridViewau_idau_nametitles)。我将titles 字段设置为模板,这样我就可以在ItemTemplate 部分插入一个gridview。 GridView 将仅包含一个列,其中包含来自特定 au_id 的所有标题(取决于外部 GridView 行的 au_id 值)。我的问题是获取该值以发送到第二个ObjectDataSource
      【解决方案4】:

      我不想更改 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>

      【讨论】:

        猜你喜欢
        • 2016-04-05
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多