Asp.Net ListView, как удалить строку, не удаляя из источника данных - PullRequest
4 голосов
/ 01 декабря 2008

Через 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;, после нажатия ссылки Удалить на веб-странице появится сообщение «Указанный метод не поддерживается». сообщение. Почему?

Если я использую вышеупомянутую строку, то страница обновляется, но я все равно вижу все исходные строки (хотя при отладке я вижу, что коллекция ListVieItem теперь содержит только элемент меньше).

1 Ответ

3 голосов
/ 01 декабря 2008

Это из-за параметра DatasourceID, который связывается при каждой обратной передаче в исходном файле.

Что вам нужно сделать, это связать свой список только при первой загрузке страницы. Тогда кнопка удаления будет работать так, как вы ожидаете.

--- после комментариев.

OK. Фактически, команда 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-файлу ниже. Не связывайтесь с ней, иначе снова появится «удаленная» строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...