列表视图排序代码显然会干扰项目处理代码

本文关键字:代码 干扰 项目 处理 视图 排序 列表 | 更新日期: 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="&lt; Prev 10"
                        NextPageText="Next 10 &gt;"
                        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#的问题。