当listview不包含layouttemplate并内置代码隐藏时,使listview可排序

时间:2011-09-06 19:20:24

标签: asp.net vb.net listview

我有一个复选框页面,我选择其中一些,点击提交,然后转到第二页。在这个页面上,我有一个使用上一页选中的复选框构建的列表视图。现在我想知道如何为这个列表视图添加可排序性。

在过去,我会将CommandName ='sort'CommandArgument ='column'添加到LayoutTemplate标题上的链接。但是因为我的listview在listview之外有它的标题行,所以这似乎不起作用。关于如何实现这一点的任何想法?这就是我到目前为止所做的:

<!-- header row (outside of listview, when I try to put it as a LayoutTemplate in listview i get an error, see below) -->
<table>
  <tr><% For Each i As String In Request.Form
            If i.IndexOf("checkbox_") = 0 Then
                Response.Write("<th>" & i.Substring(Len("checkbox_")) & "</th>")
            End If
      Next %></tr>
</table>

<!-- Then the listview: -->
<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS">
  <ItemTemplate>
   <table>
       <tr>
           <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
       </tr>
   </table>
  </ItemTemplate>
</asp:ListView>

然后在后面的代码中:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' This works fine:
    ' Get the Request Vars that are checkboxes, and build the sql command.
    ' Run the sql command
    ' Databind()
End Sub

' while binding the data, build the itemPlaceholder, to contain the contents of what's returned in the sql:
Protected Sub ReportListView_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ReportListView.ItemDataBound

    If (e.Item.ItemType = ListViewItemType.DataItem) Then
        Dim plc As PlaceHolder = DirectCast(e.Item.FindControl("itemPlaceHolder"), PlaceHolder)
        Dim di As Data.DataRowView = e.Item.DataItem()

        For Each c In di.Row.ItemArray
            Dim l As New Literal
            l.Text = String.Format("<td class='customreport'>{0}</td>", c.ToString)
            plc.Controls.Add(l)
        Next
    End If
End Sub

我试图在listview中添加一个templatelayout,但是这会在绑定数据的行上给出错误(listview.databind()),我假设因为这是不可能的。

在此列表视图中获取可排序标题行的任何方法?提前致谢?新手,对不起。

1 个答案:

答案 0 :(得分:1)

您是否考虑过处理ListView.Sorting事件,然后调用ListView.Sort方法来触发事件?

您可以在Sorting事件处理程序中添加排序逻辑,然后像这样调用Sort方法(可能来自生成的标题中的LinkBut​​ton Click事件)。

ReportListView.Sort("COLUMN", SortDirection.Ascending);

修改

这是一个简单的例子。我假设您正在使用基于DataSourceID命名的SqlDataSource。

我的示例使用SqlDataSource从名为Items的表中选择名为Item的列,然后在ListView中显示数据。

我创建了一个Button,它在ListView上执行Sort,指定Item列和排序方向。

<强>标记

<asp:Button ID="button1" runat="server" Text="Sort" OnClick="button1_Click" />
<asp:ListView ID="listView1" runat="server" DataSourceID="sqlDataSource">
    <ItemTemplate>
        <div><%# Eval("Item") %></div>
    </ItemTemplate>
</asp:ListView>
<asp:SqlDataSource ID="sqlDataSource" runat="server" ConnectionString="Data Source=.;Initial Catalog=******;Integrated Security=SSPI;" SelectCommand="SELECT Item FROM Items">
</asp:SqlDataSource>

代码背后

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session["SortDirection"] = SortDirection.Ascending;
    }
}

protected void button1_Click(object sender, EventArgs e)
{
    SortDirection sortDirection = (SortDirection)Session["SortDirection"] == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
    Session["SortDirection"] = sortDirection;

    listView1.Sort("Item", sortDirection);
}

希望这有帮助。