Запуск VWD 2010 Express на компьютере с Windows 7.
У меня есть asp: listview (на вкладке), в котором есть заголовки столбцов, которые сортируют данные (без кода с моей стороны). Эта часть работает, когда она сама по себе. Но происходит сбой, когда я пытаюсь вставить код для поддержки элементов в списке. Итак, вот что я имею:
(1) Я могу отсортировать элементы в списке, щелкнув заголовок (в данном случае «заголовок»)
asp: ListView предоставляет механизм для сортировки списка, нажав на заголовок без использования кода позади. Мы можем сделать это с помощью кнопки следующим образом:
<asp:Button runat="server" ID="SortTitle" Text="Title" CommandName="Sort" CommandArgument="sTitle" />
Нет кода позади. Этот заголовок находится в заголовке, который находится за пределами шаблона элемента. Работает нормально. Я могу сортировать списки по возрастанию и по убыванию в душе, нажав на соответствующий заголовок. Это хорошо, но я также хотел бы, чтобы программа «что-то делала» при нажатии на элемент списка.
(2) Я могу заставить что-то произойти, когда нажимаю на элемент в списке.
К счастью, существует механизм управления тем, что происходит, когда элемент щелкается в списке с помощью атрибута OnItemCommand в теге asp: ListView.
<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>
Мне кажется, что я мог бы сделать обе вещи в своем собственном коде для обработки элементов, но мне действительно это не нравится, так как я хотел бы использовать поведение автоматической сортировки, которое я получаю из Listview контроль.
Я бы подумал, что OnItemCommand = "lv_website_click" в теге asp: listview будет применяться к элементам, а CommandName = "Sort" CommandArgument = "sTitle" будет применяться к заголовкам (используемым для сортировки), поскольку они находятся за пределами элемента itemtemplate. Видимо, это не так.
Есть ли способ использовать оба из них (сортировка с помощью щелчка по заголовку и коду для элементов в списке), чтобы они не конфликтовали друг с другом?