Search code examples
c#asp.netgridviewobjectdatasource

Parameter for deleting a row


I have a problem with my delete parameter. I am using a GridView and a ObjectDataSource. And I would like to delete one row. But when I debug is see that the value of CustomerId is always 0 in my Business Logic Layer.

Here is my code

I have two delete parameters, Id and CustomerId. These are the same names as the ones in my BLL.

<asp:GridView DataKeyNames="Id" ID="gvFavoriteMovies" DataSourceID="odsFavoriteMovies" AutoGenerateColumns="False" 
    runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>            
                    <asp:Label ID="lblTitel" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Title")%>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:CommandField ShowDeleteButton="True" />

    </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="odsFavoriteFilm" runat="server"
TypeName="MovieMonstrDataLayer.bll.BLLMovies"
SelectMethod="GetFavoriteMoviesFromUser"
DeleteMethod="DeleteFavoriteMoviesFromUser" 
onobjectcreating="odsFavoriteFilm_ObjectCreating" 
    ondeleting="odsFavoriteFilm_Deleting">
    <DeleteParameters>
        <asp:Parameter Name="Id" DbType="Int32" Direction="Input" />
        <asp:Parameter Name="CustomerId" DbType="Int32" Direction="Input" />
    </DeleteParameters>
    <SelectParameters>
        <asp:Parameter DbType="Int32" Direction="Input" Name="CustomerId" />
    </SelectParameters>
</asp:ObjectDataSource>

This is in the the code behind file

When deleting a row, I assign the value of the logged in Customer to the Delete Parameter CustomerId. This all works. I give the right value to the delete parameter.

protected void odsFavoriteFilm_Deleting(object sender, ObjectDataSourceMethodEventArgs e)
{
        if (Context.User.Identity.IsAuthenticated)
        {
            this.odsFavoriteFilm.DeleteParameters["CustomerId"].DefaultValue = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString();
            this.odsFavoriteFilm.DataBind();
        }
    }

Normally in my Business Logic Layer, I should get now the right CustomerId, but I always get 0. While no Costumer has that ID.

public int DeleteFavoriteFilmFromUser(int Id, int CustomerId)
    {
        try
        {
            return Adapter.DeleteFavoriteFilmFromUser(Id, CustomerId);
        }

        catch (Exception ex)
        {
            throw ex;
        }
    }

What am I doing wrong?


Solution

  • Include CustomerID in your DataKeyNames

    <asp:GridView DataKeyNames="Id,CustomerId" ...>
    

    Either do this before the updating

    protected odsFavoriteFilm_DataBinding(object sender, EventArgs e) {
        if(!IsPostBack) {
            this.odsFavoriteFilm.DeleteParameters["CustomerId"].DefaultValue = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString();
        }
    }
    

    or set the actual parameter value for the command

    protected void odsFavoriteFilm_Deleting(object sender, ObjectDataSourceMethodEventArgs e) {
        if (Context.User.Identity.IsAuthenticated) {
            e.Command.Parameters["CustomerId"].Value = ((MovieMonstrIdentity)Context.User.Identity).Customer.Id.ToString();
        }
    }