使用代码隐藏访问 selectcommand
Posted
技术标签:
【中文标题】使用代码隐藏访问 selectcommand【英文标题】:access selectcommand using codebehind 【发布时间】:2011-08-12 17:25:22 【问题描述】:如何更改我的 selecommand,并在页面的其余部分保留它(使用分页、排序时)?
我有一页复选框:
<input type="checkbox" name="checkbox_1" />
<input type="checkbox" name="checkbox_2" />
<input type="checkbox" name="checkbox_3" />
<asp:Button runat="server" Id="CustomButton" text="Create Report" PostBackUrl="report.aspx?"/>
然后在 report.aspx 上,我想根据复选框中的选择生成标准列表视图。
<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
<LayoutTemplate runat="server">
...<asp:PlaceHolder runat="server" ID="itemPlaceHolder" />...
</LayoutTemplate>
<ItemTemplate>
...
</ItemTemplate>
</asp:ListView>
我希望能够对该列表视图进行排序和分页。这是我在后面的代码中想要的一个想法:
Protected Sub ReportListView_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
' What's the correct way to reference the listview?
' When I use the below code i get "ReportListView is not declared...."
' ReportListView.SqlCommand = "SELECT " & checkbox1 & ", " & checkbox2 & " WHERE..."
End Sub
我不确定我是否朝着正确的方向前进,感谢任何帮助。当我对列表视图应用分页或排序时,我对 PreRender 函数中的 sql 命令所做的更改会保留吗?
【问题讨论】:
【参考方案1】:如果我正确理解您的问题,您想打开一个新页面并在新页面上的ListView
的SqlDataSource
的select 语句中使用前一页的值,对吗?
首先,有几点观察:
-
在您的第一页中,您似乎打算使用查询字符串 (
PostBackUrl="report.aspx?
) 调用第二页,但您似乎没有设置查询字符串。
ListView
控件的PreRender
事件具有错误的签名。它只需要一个参数,EventArgs
:
Protected Sub ReportListView_PreRender(ByVal e As EventArgs)
您的ListView
似乎使用SqlDataSource
作为它的绑定源(DataSource="ReportListViewSDS"
)。详情请参阅下文。
ListView
控件没有 SqlCommand
属性或方法。
由于您将ListView
绑定到SqlDataSource
,因此最简单的方法是在标记中设置 Select 命令和参数,如下所示:
<asp:SqlDataSource ID="ReportListViewSDS" runat="server"
SelectCommand="SELECT checkbox1, checkbox2, checkbox3 FROM <table> WHERE checkbox1 = @parm1 AND checkbox2 = @parm2 AND checkbox3 = @parm3">
<SelectParameters>
<asp:FormParameter FormField="checkbox_1" Name="parm1" />
<asp:FormParameter FormField="checkbox_2" Name="parm2" />
<asp:FormParameter FormField="checkbox_3" Name="parm3" />
</SelectParameters>
</asp:SqlDataSource>
将SelectCommand
中的<table>
替换为您的表名。您可以根据需要调整您选择的列的名称以及您正在使用的参数。我只是使用了 3 个复选框,因为这就是您发布的代码中的内容。
还要注意,NO VALIDATION的参数将由SqlDataSource
完成,所以如果你想防止SQL注入攻击和其他安全风险,你需要在SqlDataSource
的Selecting
事件。
更多信息可以在这里找到:
SqlDataSource Class
FormParameter Class
【讨论】:
对不起,我的问题不是很清楚。我熟悉标准列表视图,并使用 Select 命令和您提到的参数。但我的目标是选择查询将包含来自 Request.From 的条目(即前几页复选框)。我发现我让它变得更加困难。请参阅下面的解决方案。【参考方案2】:实际上这比我想象的要容易得多。对不起,我猜只是一个新手错误。我最终只是在做:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim SqlCommand As String
' create the sql command using the Request.Form vars i wanted.
' ...
' Run the sql command, I can access the listview directly, just like a global variable:
ReportListView.SelectCommand = SqlCommand
ReportListView.DataBind()
End Sub
这似乎做到了。其实很容易。
【讨论】:
以上是关于使用代码隐藏访问 selectcommand的主要内容,如果未能解决你的问题,请参考以下文章
从代码隐藏访问javascript变量和从javascript访问代码隐藏变量
如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?
如何从代码隐藏中访问UserControl中样式的Setter中ControlTemplate中定义的Control实例?