Listview排序代码显然干扰了项目处理代码

时间:2011-11-21 20:58:29

标签: c# asp.net listview sorting code-behind

在Windows 7计算机上运行VWD 2010 Express。

我有一个asp:listview(在选项卡上),它有列标题对数据进行排序(我没有代码)。这部分在它本身时起作用。但是当我尝试输入代码来支持列表中的项目时,它失败了。所以这就是我到目前为止所做的:

(1)我可以通过点击标题对列表视图中的项目进行排序("标题"在这种情况下) asp:ListView提供了一种机制,通过单击标题而不使用后面的代码来对列表进行排序。我们可以用这样的按钮来做到这一点:

<asp:Button runat="server" ID="SortTitle" Text="Title" CommandName="Sort"  CommandArgument="sTitle"   />

没有代码。此标题位于项目模板之外的标题中。它工作正常。我可以通过点击相关标题对列表进行升序排序并降低到我心中的内容。这很好,但我也希望有一个程序&#34;做点什么&#34;单击列表中的项目时。

(2)当我点击列表中的某个项目时,我可以发生一些事情。 幸运的是,有一种机制可以控制通过asp:ListView标记中的OnItemCommand属性在列表中单击某个项时发生的情况。

<asp:ListView runat="server" ID="lvWebsites" DataSourceID="websiteSuggestionsDataSource" OnItemCommand="lv_website_click"  >

这种方式有点马马虎虎。它做我想要的,但它重新加载页面(我不想做)。这是一个单独的问题,我可能会就此提出另一个问题。主要的是我可以点击列表中的项目,然后执行一些代码。

当我一起使用(1)和(2)时,真正的问题就出现了。当我这样做时,它会忽略CommandName =&#34;排序&#34;在按钮标记中并执行后面的代码(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 =&#34; lv_website_click&#34;在asp:listview标签将适用于项目和CommandName =&#34;排序&#34; CommandArgument =&#34; sTitle&#34;将应用于标题(用于排序),因为它们在itemtemplate之外。显然这不是真的。

有没有办法同时使用这两种方法(通过单击标题和列表中的项后面的代码进行排序),这样它们就不会相互冲突?

1 个答案:

答案 0 :(得分:0)

解决方案在代码隐藏中。

protected void lv_website_click(object sender,ListViewCommandEventArgs e)     {         if(!e.CommandName.Equals(“Sort”)){         int searchID = Convert.ToInt32(e.CommandArgument.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#背后。