【问题标题】:asp.net Can a GridView have two DataSources?asp.net 一个 GridView 可以有两个数据源吗?
【发布时间】:2012-05-30 15:36:55
【问题描述】:

下午,

我有一个网格视图,用于显示数据库中的“操作”列表。

我有一个连接到此网格视图的下拉列表,这使用户能够通过下拉列表中的“操作状态”(“已分配”、“进行中”和“已完成”)过滤数据。这工作得很好....

我想要做的是为用户提供另一个过滤器选项,他们也想按用户名过滤。我为此设置了数据源和下拉列表,但我只能将一个数据源连接到我的 gridview?

有没有人建议如何让用户也可以按用户名和“操作状态”进行过滤?

如果你需要看一下,这是我的代码......

         <asp:SqlDataSource ID="dsActions" runat="server" 
                ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" 
                SelectCommand="Populate_grdAllActions_Filter" 
                SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="ddFilterStatus" Name="ActionStatusID" 
                    PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
         </asp:SqlDataSource>

         <asp:SqlDataSource ID="dsActionsByUser" runat="server" 
               ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" 
               SelectCommand="Populate_grdAllActions_Filter_By_User" 
               SelectCommandType="StoredProcedure">
             <SelectParameters>
                 <asp:ControlParameter ControlID="ddFilterUsers" Name="UserID" 
                     PropertyName="SelectedValue" Type="Int32" />
             </SelectParameters>
         </asp:SqlDataSource>

    <asp:SqlDataSource ID="dsFilterList" runat="server" 
            ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" 
            SelectCommand="SELECT * FROM [ActionStatus]"></asp:SqlDataSource>

    <asp:SqlDataSource ID="dsFilterUsers" runat="server" 
            ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" 
            SelectCommand="SELECT * FROM [UserSimpleList]"></asp:SqlDataSource>

    <table style="width: 400px">
        <tr>
            <td colspan="2" style="height: 25px"><b>Filter Options:</b></td>
        </tr>
        <tr>
            <td style="width: 158px">
                Select Action Status:</td>
            <td>
                <asp:DropDownList ID="ddFilterStatus" runat="server"  
                    DataTextField="ActionStatus" DataValueField="ActionStatusID" 
                 AutoPostBack="True" DataSourceID="dsFilterList"></asp:DropDownList>
            </td>
        </tr>
         <tr>
            <td style="width: 158px">
                Select Actions by User:</td>
            <td>
                   <asp:DropDownList ID="ddFilterUsers" runat="server"  
                    DataTextField="UserFullName" DataValueField="UserID" 
                 AutoPostBack="True" DataSourceID="dsFilterUsers"></asp:DropDownList></td>
        </tr>
     </table>

     <br/>

      <asp:GridView ID="grdActions" runat="server" AutoGenerateColumns="False" 
            DataSourceID="dsActions" CssClass="mGrid" 
            PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" 
           AllowPaging="True" PageSize="6" DataKeyNames="ActionID" Width="68%" >
      <AlternatingRowStyle CssClass="alt" />
    <Columns>
          <asp:HyperLinkField DataNavigateUrlFields="ActionID" DataNavigateUrlFormatString="~/UpdateAction.aspx?Edit={0}"
                DataTextField="ActionID" HeaderText="Action ID" >
                <HeaderStyle HorizontalAlign="Center" Wrap="True" />
                <ItemStyle HorizontalAlign="Center" />
            </asp:HyperLinkField>
        <asp:BoundField DataField="Action" HeaderText="Action" 
            SortExpression="Action" >
          <HeaderStyle HorizontalAlign="Center" />
          </asp:BoundField>
        <asp:BoundField DataField="Owner" HeaderText="Owner" 
            SortExpression="Owner">
          <HeaderStyle HorizontalAlign="Center" />
          <ItemStyle Wrap="False" />
          </asp:BoundField>
        <asp:BoundField DataField="TargetDate" HeaderText="Target Date" 
            SortExpression="TargetDate"  DataFormatString="{0:dd-MM-yyyy} " >
          <HeaderStyle HorizontalAlign="Center" Wrap="True" />
          <ItemStyle Wrap="False" />
          </asp:BoundField>
        <asp:BoundField DataField="Action Status" HeaderText="Action Status" 
            SortExpression="Action Status" >
          <HeaderStyle HorizontalAlign="Center" Wrap="True" />
          <ItemStyle Wrap="False" />
          </asp:BoundField>
     </Columns>
       <PagerStyle CssClass="pgr" />
    </asp:GridView>

任何帮助都是提前得到的。

问候 贝蒂

【问题讨论】:

  • 我不知道您的表格是什么样的,但从您的问题描述中您想查看操作,然后按用户操作,所以在 dsFilterUsers 中,您不会有 SELECT * FROM [ActionStatus] WHERE user = userSelected 吗?因此,无需创建另一个数据源,只需更改现有数据源,然后重新绑定它(grdActions.DataBind()

标签: asp.net visual-studio-2010 gridview


【解决方案1】:

您可以确定用户选择了哪个选项,然后在代码隐藏中设置数据源,而不是在 aspx 中将它们连接起来。

伪代码假定如果选择了 FilterUsers 下拉菜单,则绑定到 Action By User 数据源:

if(IsPostBack){
    if(ddlFilterUsers.SelectedValue <> ""){
        grdActions.DataSource = dsActionsByUser;
        dsFilterUsers.DataBind();
        //etc
    }
}

【讨论】:

    【解决方案2】:

    在后面的代码部分中,在 ddFilterStatus_SelectIndexChanged() 事件中,检查适当的“操作状态”并选择数据源,如下所示,

     if(ddFilterStatus.SelectedValue == someid1)
     {
    
         grdActions.DataSource =  appropriate datasource
    
     }
     else
     {
          grdActions.DataSource =  appropriate datasource
      }
      grdActions.DataBind()
    

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2022-11-16
      • 2012-10-09
      • 1970-01-01
      相关资源
      最近更新 更多