webForumDet fria alternativet

RowDeleting i Gridview raderar två rader istället för en

.NET

5 svar · 443 visningar · startad av haxx

Medlem sedan maj 200654 inlägg
Frågan#1

RowDeleting i Gridview raderar två rader istället för en. När jag ska radera en rad så raderas två istället. Ett exempel är att när jag klickar på raden med listId 32 så raderas den raden och den rad med närmast lägsta listId.

Vad beror detta på?

protected void Grid_RowDeleting(Object sender, GridViewDeleteEventArgs e)
    {
        string listId = Grid.DataKeys[e.RowIndex].Value.ToString();
        bool success = CatalogAccess.DeleteAdressList(listId);
        statusLabel.Text = success ? "Delete successful" : "Delete failed";
        BindGrid();
    }
public static bool DeleteAdressList(string listId)
    {
        DbCommand comm = GenericDataAccess.CreateCommand();
        comm.CommandText = "DeleteAdressList";
        DbParameter param = comm.CreateParameter();
        param.ParameterName = "@listId";
        param.Value = listId;
        param.DbType = DbType.Int32;
        comm.Parameters.Add(param);
        int result = -1;
        try
        {
            result = GenericDataAccess.ExecuteNonQuery(comm);
        }
        catch
        {

        }
        return (result != -1);
    }
public static int ExecuteNonQuery(DbCommand command)
    {
        int affectedRows = -1;
        try
        {
            command.Connection.Open();
            affectedRows = command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            command.Connection.Close();
        }
        return affectedRows;
    }
Medlem sedan maj 200654 inlägg
#2

Så här står det när jag raderar den rad med lägst listId:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Source Error:

Line 29: protected void Grid_RowDeleting(Object sender, GridViewDeleteEventArgs e)
Line 30: {
Line 31: string listId = Grid.DataKeys[e.RowIndex].Value.ToString();
Line 32: bool success = CatalogAccess.DeleteAdressLista(listId);
Line 33: statusLabel.Text = success ? "Delete successful" : "Delete failed";

Medlem sedan dec. 19996 522 inlägg
#3

Har inte kollat in din kod, men jag vet att det finns en bugg i Gridview och RowDeleting, men den uppenbarar sig bara om man använder en bildknapp för att radera raden. Gör du det?

Medlem sedan maj 200654 inlägg
#4

Ja, faktist så gör jag det. Finns det något sätt att komma runt detta problem?

Medlem sedan maj 200654 inlägg
#5

Jag har suttit i flera timmar och letat efter felet, tack för att du sa det!

Medlem sedan maj 200654 inlägg
#6

Kollade upp problemet, och jag har lösningen. Tack än en gång erka för svaret.

T ex så kan man göra så här:

<asp:ImageButton runat=server id="ImageButton1" CommandName="Delete"
ImageUrl="..." CommandArgument='<%# DataBinder.Eval(Container,
"RowIndex") %>' OnCommand="ImageButton1_Command">

protected void ImageButton1_Command(object sender, CommandEventArgs e) {
GridView1.DeleteRow(Int32.Parse(e.CommandArgument.ToString() ));
}
263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)