4

CommandName="Delete"データソースからではなく、ListView コントロールから行を削除しようとしました。[削除] を押すと、Web ページがリロードされ、更新された ListView (1 行が削除された状態) が表示されることを期待しています。しかし、何も変わりません。Delete キーを押した後、ListView には同じ内容が表示されます。私は何を間違っていますか?

    <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;、[削除] リンクを押した後、Web ページに「指定されたメソッドはサポートされていません」というメッセージが表示されます。メッセージ。なんで?

上記の行を使用すると、ページが更新されますが、元の行はすべて表示されます (ただし、デバッグ時に ListVieItem コレクションに含まれる項目が 1 つ少ないことがわかります)。

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 に答える