使用代码隐藏访问 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】:

如果我正确理解您的问题,您想打开一个新页面并在新页面上的ListViewSqlDataSource 的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 中的&lt;table&gt; 替换为您的表名。您可以根据需要调整您选择的列的名称以及您正在使用的参数。我只是使用了 3 个复选框,因为这就是您发布的代码中的内容。

还要注意,NO VALIDATION的参数将由SqlDataSource完成,所以如果你想防止SQL注入攻击和其他安全风险,你需要在SqlDataSourceSelecting 事件。

更多信息可以在这里找到:

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实例?

如何使用c#访问excel中的隐藏列