【问题标题】:SqlDataSource ControlParameter not workingSqlDataSource ControlParameter 不起作用
【发布时间】:2016-02-24 21:26:05
【问题描述】:

我有一个由 SQL 表填充的下拉列表 (selProject)。 value 是 id 字段,name 是 name 字段。

我有一个由 sqldatasource 提供的 gridview 控件。

我想要做的是基于 selProject 下拉菜单的条件 where 子句。我花了 3 个小时搜索并试图弄清楚这一点。我担心我会咬死一个同事。

当我在下拉列表中选择特定值时,控件的 selectedValue 为“40”。我通过调试验证了这一点。这是正确的,也是意料之中的。

我有一个如下所示的 controlParameter:

<asp:ControlParameter ControlID="selProject" PropertyName="SelectedValue" Name="ProjectIDPass" Type="Int32" />

SelectCommand 包括:(Batches.ProjectID = @ProjectIDPass) 作为 Where 子句的一部分。

我没有得到任何行,没有错误,没有问题。我怀疑的问题是下拉列表的 SelectedValue 是一个字符串,而 Batches.ProjectID 是一个整数。

当我将 40 硬编码到 where 子句中代替 @ProjectIDPass 时,效果很好。当我回到 ControlParameter 时,炸弹就出来了。我尝试了各种转换技术。

有什么方法可以查看使用实际值代替参数执行的 SqlDataSouce SelectCommand。

【问题讨论】:

    标签: vb.net sqldatasource controlparameter


    【解决方案1】:

    我怀疑的问题是下拉列表的 SelectedValue 是一个字符串,而 Batches.ProjectID 是一个整数。

    值得怀疑 - Type 属性会处理转换,您的 RDBMS 也会处理(尽管它可能会将 int 列转换为字符串,从而弄乱您的索引)。

    有什么方法可以查看使用实际值代替参数执行的 SqlDataSouce SelectCommand。

    像 Sql Profiler 这样的 RDBMS 分析器将是最好的方法。但您也可以挂钩SqlDataSource.SelectingSqlDataSource.Selected 事件并检查e.Commande.Arguments

    【讨论】:

    • 这非常有帮助。我遇到的问题是,在 SqlDataSource.Selecting 期间,我正在检查下拉列表 selected.index 和 selected.value 的值,并且这些值尚未设置。因此,它向 SQLDataSource 提供无效的值,因此不提取任何行。我确信这是页面上加载的顺序问题。在 contentPlaceHolder 部分,我从母版页变量的代码中设置 dropdown.selectedvalue 的值。在选择事件中,母版页变量尚不可用。有什么想法吗?
    • @CPalmer - 设置选定值后可以重新绑定
    • 好的,我看到初始数据绑定发生在 page_init 上,然后是在控制 sqldatasource 参数的下拉菜单上设置值的任何代码。啊!!对解决方法有任何想法吗?
    • 退后一步,从更高的角度看待这个问题。好的,所以我试图根据用户最后在 2 个下拉菜单中选择的内容设置 cookie。从母版页读取该 cookie。设置 2 个下拉列表的值,然后根据 2 个下拉列表的值填充网格视图。但是在设置下拉列表之前,gridview 正在填充。所以 VB.Net 将强制填充 sqldatasource,然后我需要强制重新填充,导致每个页面加载对 SQL Server 运行 2 个查询?
    • @CPalmer - 用你的 Init 和 SelectedValues 代码询问一个新的 Q,这样我们就可以看到发生了什么;赔率就像在 !IsPostBack 中没有您的初始 DataBind,或者您已关闭 ViewState 等。快速修复可能是取消第一个选择,或手动设置它,或者更早地设置您的母版页变量......很难说没有代码。
    【解决方案2】:

    所以我解决了我的问题,完全不了解如何处理 GridView。

    我想根据 2 个下拉列表中的值加载数据,而不进行回发。这样,用户可以从一个页面转到另一个页面,而不必继续设置下拉菜单。在页面加载之前这是不可能的,因为在页面加载几乎完成之前不会设置下拉菜单。 Gridviews 填充在 Page Init 上。我可以使用我设置的 cookie 来设置 SQL 查询中的数据,但是如果用户更改下拉列表,则在页面加载之前,cookie 不会使用新数据重置,所以我会加载错误的数据。

    我找到了一个解决方案,即允许页面加载,然后使用此时正确设置的框的值,并使用它们来查询数据集并将其分配给 GridView。由于此时页面已完全加载,让它实际显示数据的技巧是更新面板。

    完整描述见这篇文章:http://www.aspsnippets.com/Articles/Bind-Load-GridView-after-Page-load-is-completed-using-AJAX-UpdatePanel-in-ASPNet.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2019-02-11
      • 1970-01-01
      相关资源
      最近更新 更多