2011-11-21 44 views
-1

在Windows 7計算機上運行VWD 2010 Express。Listview排序代碼顯然干擾項目處理代碼

我有一個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)。這就好像系統不會區分列表視圖中的標題和列表視圖中的實際列表項目。

下面是我正在使用的實際代碼的子集。我使用的標籤和這個特定的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> 

這讓我覺得我可能會做兩件事在我自己的代碼來處理的項目,但我真的不喜歡這樣,因爲我想用自動分揀行爲,我從列表視圖獲得控制。

我會認爲在asp:listview標籤中的OnItemCommand =「lv_website_click」將應用於項目,而CommandName =「Sort」CommandArgument =「sTitle」將應用於標題(用於排序),因爲它們位於itemtemplate之外。顯然這不是真的。

是否有一種方法可以使用這兩種方法(點擊標題後的點擊和列表中的項目進行排序),以便它們不會相互衝突?

+0

編輯。「代碼以支持項目」 – elbillaf

回答

0

解決方案是在代碼隱藏。

保護無效lv_website_click(對象發件人,ListViewCommandEventArgs E) { 如果(!e.CommandName.Equals( 「分類」)){ 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#。