У меня есть ListView, в котором перечислены функции продукта на моем веб-сайте. Я включил кнопку с изображением, которая должна удалить конкретную функцию, но моя команда DeleteCommand этого не сделает. Я просмотрел свою базу данных, но запись все еще там. Есть ли какой-то код, который мне нужно добавить в файл CodeBehind, чтобы это работало?

  <!-- Features --> 
 <asp:TabPanel id="tab1" class="infoHeader" runat="server" HeaderText="Features" DataKeyNames="MarketingID">
    <HeaderTemplate>Features</HeaderTemplate>
    <ContentTemplate>
        <ul class="info">
        <asp:ListView ID="lvFeatures" runat="server" DataSourceID="dsFeatures">
        <ItemTemplate>
          <li><%#Eval("FeatureTitle")%>
              <asp:ImageButton ID="DeleteFeatureButton" runat="server" Style="float:right;" AlternateText="" ImageUrl="../../images/delete.png" CommandName="Delete" OnCommand="ImageButton1_Command" OnClientClick="return confirm('Are you sure you want to delete this feature?')" />
          </li>
        </ItemTemplate>
        </asp:ListView>
        </ul>
    </ContentTemplate>
</asp:TabPanel>   

   Protected Sub ImageButton1_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
    If TypeOf DirectCast(sender, ImageButton).Parent Is ListViewDataItem Then
        Dim item As ListViewDataItem = TryCast(DirectCast(sender, ImageButton).Parent, ListViewDataItem)
        If item IsNot Nothing Then
            lvFeatures.Items.RemoveAt(item.DisplayIndex)
        End If
    End If
End Sub

<!-- Gets all current features of this product -->
<asp:SqlDataSource ID="dsFeatures" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    ProviderName="<%$ ConnectionStrings:ProductsConnectionString.ProviderName %>" 
    SelectCommand="SELECT m.MarketingID, f.FeatureID, f.FeatureTitle FROM Feature f INNER JOIN Marketing m ON m.MarketingData = f.FeatureID WHERE m.MarketingTypeID = 3 and m.ProductID = @ProductID"
    DeleteCommand="DELETE FROM Marketing WHERE MarketingID = @MarketingID">
    <SelectParameters>
        <asp:QueryStringParameter Name="ProductID" QueryStringField="id" />
    </SelectParameters>
    <DeleteParameters>
        <asp:QueryStringParameter Name="MarketingID" QueryStringField="id" />
    </DeleteParameters>
</asp:SqlDataSource>
0
Jamie 26 Авг 2011 в 22:16

3 ответа

Лучший ответ

Чтобы удалить элемент с помощью SqlDataSource, вы должны сделать это следующим образом:

Измените удаляемую часть элемента управления SqlDataSource. Удалите QueryStringParameter из DeleteParameters. У вас не должно быть никаких параметров для удаления:

<asp:SqlDataSource ID="dsFeatures" runat="server"                 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>"                 
    ProviderName="<%$ ConnectionStrings:ProductsConnectionString.ProviderName %>"                 
    SelectCommand="SELECT m.MarketingID, f.FeatureID, f.FeatureTitle FROM Feature f INNER JOIN Marketing m ON m.MarketingData = f.FeatureID WHERE m.MarketingTypeID = 3 and m.ProductID = @ProductID"                
    DeleteCommand="DELETE FROM Marketing WHERE MarketingID = @MarketingID">                
    <SelectParameters>                
        <asp:QueryStringParameter Name="ProductID" QueryStringField="id" />                
    </SelectParameters>                               
</asp:SqlDataSource> 

Добавьте MarketingID в качестве ключа данных в свой ListView:

<asp:ListView ID="lvFeatures" runat="server" DataSourceID="dsFeatures" DataKeyNames="MarketingID">    
    <ItemTemplate>    
        <li>    
            <%#Eval("FeatureTitle")%>    
            <asp:ImageButton ID="DeleteFeatureButton" runat="server" Style="float:right;" AlternateText="" ImageUrl="../../images/delete.png" CommandName="Delete" OnClientClick="return confirm('Are you sure you want to delete this feature?');" />        
        </li>    
    </ItemTemplate>    
</asp:ListView> 

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

protected void dsFeatures_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
    string commandText = e.Command.CommandText;
}
1
James Johnson 26 Авг 2011 в 21:08

Если вы прикрепите свойство datakeynames к списку, оно должно автоматически подключиться к нему.

<asp:ListView ID="lvFeatures" runat="server" DataSourceID="dsFeatures"
 DataKeyNames="MarketingID">

Предполагается, что идентификатор является частью набора данных. Вам нужно будет изменить параметр в <DeleteParameters> на обычный параметр, а не на параметр строки запроса.

2
ScottE 26 Авг 2011 в 18:29

Фактически вы не назначили обработчик командного события. Вы также должны присвоить индекс аргументу команды.

РЕДАКТИРОВАТЬ : только что заметил, что ImageButton содержится в ListView, который содержится в TabPanel. Пересмотренный код для удаления элемента из ListView.


Оригинальный способ удаления элемента из списка

<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Delete" CommandArgument='<%#Container.ItemIndex%>' OnCommand="ImageButton1_Command" ...>

В коде позади :

РЕДАКТИРОВАТЬ : удален код C # и включен синтаксис VB.NET. РЕДАКТИРОВАТЬ : изменен метод с частного на защищенный.

Protected Sub ImageButton1_Command(sender As Object, e As CommandEventArgs)
    If e.CommandName.ToUpper() = "DELETE" Then           
       lvFeatures.Items.RemoveAt(DirectCast(e.CommandArgument, Integer))
    End If
End Sub

РЕДАКТИРОВАТЬ : добавлены альтернативные методы удаления элемента, поскольку Container.ItemIndex не работает должным образом в его коде.


Альтернативные способы удаления элемента из списка

Полностью удалите аргумент команды, например:

<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Delete"  OnCommand="ImageButton1_Command" ...>

Альтернатива №1: Удалить элемент напрямую

Protected Sub ImageButton1_Command(sender As Object, e As CommandEventArgs)
    If TypeOf DirectCast(sender, ImageButton).Parent Is ListViewDataItem Then
        Dim item As ListViewDataItem = TryCast(DirectCast(sender, ImageButton).Parent, ListViewDataItem)
        If item IsNot Nothing Then
            lvFeatures.Items.Remove(item)                
        End If
    End If
End Sub

Альтернатива # 2: удалить элемент по индексу отображения

Protected Sub ImageButton1_Command(sender As Object, e As CommandEventArgs)
    If TypeOf DirectCast(sender, ImageButton).Parent Is ListViewDataItem Then
        Dim item As ListViewDataItem = TryCast(DirectCast(sender, ImageButton).Parent, ListViewDataItem)
        If item IsNot Nothing Then                               
            lvFeatures.Items.RemoveAt(item.DisplayIndex)
        End If
    End If
End Sub
0
Community 20 Июн 2020 в 09:12