列表视图排序代码显然会干扰项目处理代码
本文关键字:代码 干扰 项目 处理 视图 排序 列表 | 更新日期: 2023-09-27 18:15:16
在windows 7机器上运行VWD 2010 Express
我有一个asp:listview(在一个选项卡上),它有排序数据的列标题(我没有代码)。这部分单独使用时可以工作。但是当我试图输入代码来支持列表中的项目时,它失败了。下面是目前为止的内容:
(1)我可以通过点击标题(在本例中为"title")对列表视图中的项目进行排序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)不管我是否点击标题(标题)或列表中的实际项目。这就好像系统没有区分listview中的标题和listview中的实际列表项。
下面是我正在使用的实际代码的一个子集。我用的是选项卡这个列表视图在第一个选项卡上所以我把它。整个代码有点长,但我认为您可以从中获得一般上下文(其余大部分都是这段代码的重复)。
<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" commandparameter ="sTitle"将适用于标题(用于排序),因为它们在itemtemplate之外。显然这不是真的。
是否有一种方法可以同时使用这两种方法(在列表中的项目后面单击标题和代码进行排序),因此它们不会相互冲突?
解决方案在代码后面。
protected void lv_website_click(对象发送者,ListViewCommandEventArgs e){if (!e.CommandName.Equals("Sort")) {int searchID = Convert.ToInt32(e. commandparameter . tostring ());
TableAdapters.SuggestionsTableAdapter sAdapt =
new TableAdapters.SuggestionsTableAdapter();
SuggestionsDataTable tbl = sAdapt.GetDataByID(searchID);
tbMessage.Text = tbl.Rows[0]["message"].ToString();
lbField2.Text = tbl.Rows[0]["field2"].ToString();
lbStuff.Text = tbl.Rows[0]["stuff"].ToString();
}
}
关键是方法体周围的"if"。如果它不是一个排序事件(即CommandName不等于"排序"然后做任何事情,你应该做的,当你点击一个项目。否则,如果它是一个排序,就忽略代码。我误解了这里发生的事。我认为它忽略了排序并执行其他代码。发生的事情是,如果CommandName是Sort,那么它正在做排序,但它也在执行我的后台代码(这就是它有错误的地方)。
也就是说,这不是aspx的问题(正如我所想的),而是c#的问题。