如何使用sqldatasource填充Asp.net下拉列表,该sqldatasource在运行时绑定了连接字符串?

时间:2017-01-18 18:57:14

标签: asp.net sql-server vb.net

所以,我一直在争取这个时间超过我想承认的时间,而且似乎无法找到关于我做错的信息。所以,谦卑地,我提交了这个问题。

我有2个下拉列表和数据源,如下所示:

<asp:DropDownList ID="ddAdminYear" runat="server" enabled="false"      DataTextField="YEAR_ID" DataValueField="YEAR_ID" AutoPostBack="True" AppendDataBoundItems="true">
<asp:ListItem Text="----------" Value="----------" /></asp:DropDownList>
<asp:SqlDataSource ID="sdsAdminDistinctYr" runat="server"
ProviderName="System.Data.SqlClient" SelectCommand="SELECT DISTINCT YEAR_ID FROM  PC_YEAR ORDER BY YEAR_ID" DataSourceMode="DataReader"></asp:SqlDataSource>

<asp:DropDownList ID="tbOneUnit" runat="server" AutoPostBack="True" 

DataTextField="LONG_DESC" DataValueField="SHORT_DESC_EN" AppendDataBoundItems="True" Enabled="True">
    <asp:ListItem Text="----------" Value="----------" /></asp:DropDownList>
    <asp:SqlDataSource ID="sdsAdminMunic" runat="server" Onselecting="eventselect" ProviderName="System.Data.SqlClient" SelectCommand="GET_MUNIC_LISTING_VB" SelectCommandType="StoredProcedure" >
<SelectParameters> 
      <asp:controlparameter DefaultValue="2017"     Name="year" controlid="ddAdminYear" propertyname="SelectedValue"/>
      <asp:Parameter DefaultValue="default"  Name="region" Type="String"/>
      <asp:Parameter DefaultValue="default"  Name="u_r" Type="String"/>
      <asp:Parameter DefaultValue="default"  Name="UserGroup" Type="String"/>
</SelectParameters>
</asp:SqlDataSource>

页面加载时设置sdsAdminDistinctYr的connectionString。运行的代码如下所示:

sdsAdminDistinctYr.ConnectionString = _user.SelectedDBConn
ddAdminYear.DataSourceID = "sdsAdminDistinctYr"

然后,在ddAdminYear的select事件处理程序中,我按如下方式设置tbOneUnit的数据源:

sdsAdminMunic.ConnectionString = _user.SelectedDBConn
tbOneUnit.DataSourceID = "sdsAdminMunic"
tbOneUnit.DataBind()

ddAdminYear下拉列表填充,但tbOneUnit下拉列表不会填充。

如何根据ddAdminYear值使用存储过程填充tbOneUnit下拉列表?

编辑: 我无法发布存储过程本身,但这里是标题:

[dbo].[GET_MUNIC_LISTING_VB] (
    @YEAR smallint,
    @REGION as varchar(5) = NULL,
    @U_R as varchar(2) = NULL, 
    @USERGROUP as varchar(10) = NULL)

我可以验证它返回数据。 如果其他任何事情都有帮助,请告诉我。

编辑#2:    存储过程正在运行,但“默认”值正在作为字符串传递(我已指定)...所以,这不是我想要做的。 现在,应用程序将传递类似:

exec GET_MUNIC_LISTING_VB @year=N'2017',@region=N'default,N'@u_r=N'default',@UserGroup=N'default'

对于应用程序,我希望它通过: exec GET_MUNIC_LISTING_VB @ year = N'2017',@ region = default,@ u_r = default,@ UserGroup = default

2 个答案:

答案 0 :(得分:1)

我会以两种方式之一来解决问题,具体取决于两个下拉列表的所有可能数据组合需要多少数据。

如果ddAdminYear的值有限,我会为每个值创建一个tbOneUnit,然后我会使用一些javascript根据所选值动态显示或隐藏每个下拉列表。您需要创建一个foreach循环和唯一的Id或其他标识符,以便您可以识别每个唯一的下拉列表。

$(document).ready(function() {
    $('#ddAdminYear').change(function() {

        var adminYear = $(this).val();

        $('.tbOneUnit').hide();
        $('#tbOneUnit_' + adminYear).show();

    });
});

如果上面的解决方案有太多数据,那么另一个解决方案是每次ddAdminYear更改时创建一个ajax事件,并使用它来填充tbOneUnit的数据。这当然要求你从服务器上编写一个方法,根据ddAdminYear的当前值返回tbOneUnit的正确数据。

$(document).ready(function() {
    $('#ddAdminYear').change(function() {

        var adminYear = $(this).val();

        var get = $.ajax('/GetTbData', adminYear);

        get.done(function(data) {
            // take data and add to drop down here
        });

    });
});

答案 1 :(得分:1)

因此,当我想使用存储过程中定义的默认值时,看起来我的问题是我正在指定执行存储过程的参数。

我能够通过注释掉我指定的参数来解决这个问题,只留下ddAdminYear controlParameter。这产生了以下代码RPC:

exec GET_MUNIC_LISTING_VB @year=N'2017'

感谢所有发布并努力的人。