2011-11-21 30 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#。