【发布时间】:2012-01-03 08:15:44
【问题描述】:
在 Windows 7 机器上运行 VWD 2010 Express。
我有一个 asp:listview(在选项卡上),它具有对数据进行排序的列标题(我没有代码)。这部分单独工作时有效。但是当我尝试输入代码以支持列表中的项目时它失败了。所以这是我目前所拥有的:
(1) 我可以通过单击标题(在本例中为“标题”)对列表视图中的项目进行排序 asp:ListView 提供了一种通过单击标题而不使用后面的代码来对列表进行排序的机制。我们可以用这样的按钮来做到这一点:
<asp:Button runat="server" ID="SortTitle" Text="Title" CommandName="Sort" CommandArgument="sTitle" />
后面没有代码。此标题位于项目模板之外的标题中。它工作正常。我可以通过单击关联的标题对列表进行升序和降序排序。这很好,但我也想让程序在单击列表中的项目时“做某事”。
(2) 当我点击列表中的一个项目时,我可以做一些事情。 幸运的是,有一种机制可以通过 asp:ListView 标记中的 OnItemCommand 属性控制单击列表中的项目时发生的情况。
<asp:ListView runat="server" ID="lvWebsites" DataSourceID="websiteSuggestionsDataSource" OnItemCommand="lv_website_click" >
这有点马马虎虎。它做我想做的事,但它重新加载页面(我不想这样做)。这是一个单独的问题,我可能会就此提出不同的问题。主要是我可以点击列表中的项目,它会在后面执行一些代码。
当我同时使用 (1) 和 (2) 时,真正的问题出现了。当我这样做时,它会忽略按钮标记中的 CommandName="Sort" 并执行 (lv_website_click) 后面的代码,无论我是单击标题(标题)还是列表中的实际项目。就好像系统不区分列表视图中的标题和列表视图中的实际列表项。
这是我正在使用的实际代码的一个子集。我正在使用选项卡,这个特定的列表视图位于第一个选项卡上,所以我将其包括在内......整个代码更长一些,但我认为你可以通过它获得一般上下文(其余大部分都是重复的这段代码)。
<div id='tab-container'>
<div class="tab-content" style="width:1000px">
<h1 class="tab" title="Feedback on the site">Site Feedback</h1>
<asp:ListView runat="server" ID="anID"
DataSourceID="mydatasource"
OnItemCommand="lv_website_click" >
<LayoutTemplate>
<table id="table1" style="background-color:White;border-collapse:collapse;" width="100%">
<tr style="background-color:White">
<td width="75%">
<asp:Button runat="server" ID="SortTitle"
Text="Title" CommandName="Sort" CommandArgument="sTitle" /></td>
<td> <asp:Button runat="server" ID="LinkButton1"
Text="Posted" CommandName="Sort" CommandArgument="sDate" /></td>
<td> <asp:Button runat="server" ID="SortDate"
Text="Status" CommandName="Sort" CommandArgument="sStatus" /></td>
</tr>
<tr runat="server" id="itemPlaceholder">
</tr>
</table>
<asp:DataPager runat="server" ID="datapagerSites" PageSize="10" style="background-color:White" enableviewstate="false"
PagedControlID="lvWebsites" >
<Fields>
<asp:TemplatePagerField>
<PagerTemplate>
<b>
Page
<asp:Label runat="server" ID="CurrentPageLabel"
Text="<%# Container.TotalRowCount>0 ? (Container.StartRowIndex / Container.PageSize) + 1 : 0 %>" />
of
<asp:Label runat="server" ID="TotalPagesLabel"
Text="<%# Math.Ceiling ((double)Container.TotalRowCount / Container.PageSize) %>" />
(
<asp:Label runat="server" ID="TotalItemsLabel"
Text="<%# Container.TotalRowCount%>" />
records)
<br />
</b>
</PagerTemplate>
</asp:TemplatePagerField>
<asp:NextPreviousPagerField
ButtonType="Button"
ShowFirstPageButton="true"
ShowNextPageButton="false"
ShowPreviousPageButton="false" />
<asp:NumericPagerField
PreviousPageText="< Prev 10"
NextPageText="Next 10 >"
ButtonCount="10" />
<asp:NextPreviousPagerField
ButtonType="Button"
ShowLastPageButton="true"
ShowNextPageButton="false"
ShowPreviousPageButton="false" />
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<tr id="Tr1" runat="server" style="background-color:#ECE5B6;" >
<td><asp:Button BackColor="#ECE5B6" CommandName="lcommand" runat="server" ID="Title" Text='<%# Eval("sTitle")%>' CommandArgument='<%# Eval("sID") %>' /></td>
<td><asp:Label runat="server" ID="Label1" Text='<%# Eval("posted")%>' /></td>
<td><asp:Label runat="server" ID="Status" Text='<%# Eval("sStatus")%>' /></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr id="Tr1" runat="server" style="background-color:#FAF8CC;" >
<td><asp:Button BackColor="#FAF8CC" CommandName="lcommand" runat="server" ID="Title" Text='<%# Eval("sTitle")%>' CommandArgument='<%# Eval("sID") %>' /></td>
<td><asp:Label runat="server" ID="Label1" Text='<%# Eval("posted")%>' /></td>
<td><asp:Label runat="server" ID="Status" Text='<%# Eval("sStatus")%>' /></td>
</tr>
</AlternatingItemTemplate>
</asp:ListView>
</div>
</div>
令我震惊的是,我也许可以在自己的代码中同时做这两件事来处理项目,但我真的不喜欢这样,因为我想使用从列表视图控件。
我认为 asp:listview 标记中的 OnItemCommand="lv_website_click" 将应用于项目,而 CommandName="Sort" CommandArgument="sTitle" 将应用于标题(用于排序),因为它们在项目模板之外。显然这不是真的。
有没有办法同时使用这两种方法(点击列表中项目的标题和代码进行排序),这样它们就不会相互冲突?
【问题讨论】:
-
已编辑。 “支持项目的代码”
标签: c# asp.net listview sorting code-behind