Asp.Net ListView如何在不删除数据源的情况下删除行

时间:2008-12-01 12:06:39

标签: asp.net listview

通过CommandName="Delete"我尝试从ListView控件中删除一行,但不从数据源中删除。 On Press Delete我希望网页重新加载并显示更新的ListView(删除一行)。但没有任何变化,ListView将在按Delete后显示相同的内容。我做错了什么?

    <asp:ListView ID="ListView1"     
                    DataSourceID="XmlDataSource1" 
                    ItemContainerId="DataSection"                       
                    runat="server">        
    <LayoutTemplate>
    <h3>Protocols to Upload...</h3>                               
      <table border=0 style="background-color:#9C9EFF; width: 100%;">  
        <tr align=left>
            <th>Region/Exam/Program</th><th>Protocol</th><th>Position</th>
        </tr>                       
        <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
      </table>
    </LayoutTemplate>                              
    <ItemTemplate>          
      <tr>
        <td><%#XPath("Location/Path")%></td>
        <td><%#XPath("Location/Name")%></td>
        <td><%#XPath("Location/Position")%></td>
        <td style="width:40px">
         <asp:LinkButton  ID="SelectCategoryButton" runat="server" Text="Select" CommandName="Select"/>
        </td>
      </tr>

    </ItemTemplate>       
    <SelectedItemTemplate>
      <tr id="Tr1" runat="server" style="background-color:#F7F3FF">
        <td><%#XPath("Location/Path")%></td>
        <td><%#XPath("Location/Name")%></td>
        <td><%#XPath("Location/Position")%></td>
         <td style="width:40px">
            <asp:LinkButton runat="server" ID="SelectCategoryButton" Text="Delete" CommandName="Delete" />
        </td>
      </tr>
    </SelectedItemTemplate>
   <%-- <ItemSeparatorTemplate>
      <div style="height: 0px;border-top:dashed 1px #ff0000"></div>
    </ItemSeparatorTemplate>--%>
    </asp:ListView>         
    <asp:XmlDataSource ID="XmlDataSource1" XPath="HttpRequestBO/ProtocolsDTO/ProtocolDTO"  runat="server" 
        DataFile="~/HttpRequestBo.Sample.xml"></asp:XmlDataSource>

这就是背后的代码:

protected void Page_Load(object sender, EventArgs e)
{
}

protected void ListView1_OnItemDeleted(Object sender, ListViewDeletedEventArgs e)
{
    if (e.Exception != null)
    {                   
        e.ExceptionHandled = true;
    }
}

protected void ListView1_OnItemCommand(object sender, ListViewCommandEventArgs e)
{
    if (String.Equals(e.CommandName, "Delete"))
    {
        ListViewDataItem dataItem = (ListViewDataItem)e.Item;
        ListView1.Items.Remove(dataItem);
    }
}

如果我不使用e.ExceptionHandled = true;,则在按下删除链接后,网页将显示“不支持指定的方法”。信息。为什么呢?

如果我使用上面提到的行,那么页面刷新但我仍然可以看到所有原始行(虽然在调试时我可以看到ListVieItem集合现在只包含较少的项目。)

1 个答案:

答案 0 :(得分:3)

这是因为DatasourceID参数绑定了原始文件的每一个回发。

您应该做的是仅在第一页加载时绑定您的列表。删除按钮将按预期工作。

---评论后。

行。 实际上,如果已在数据源上定义了Delete方法,则Delete命令将起作用。由于这不是您想要的,您必须定义ItemCommand事件处理程序 并告诉它删除发出该事件的ListViewItem。

protected void yourListView_OnItemCommand(object sender, ListViewCommandEventArgs e)
{
  if (String.Equals(e.CommandName, "Delete"))
  {
    ListViewDataItem dataItem = (ListViewDataItem)e.Item;
    yourListView.Items.Remove(dataItem);
  }
}

它会在不触及下面的XML文件的情况下这样做。不要对它进行数据绑定,否则“已删除”行将再次出现。