4

通过CommandName="Delete"我尝试从 ListView 控件中删除一行,而不是从数据源中删除一行。在按下 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;,按 Delete 链接后,网页会出现“不支持指定的方法”。信息。为什么?

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

4

1 回答 1

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 文件的情况下这样做。不要对其进行数据绑定,否则“已删除”行将再次出现。

于 2008-12-01T12:56:44.540 回答