Avatar billede pelkjaer Nybegynder
10. november 2003 - 15:38 Der er 11 kommentarer og
1 løsning

Delete i DataGrid - Index was out of range.

Jeg får flg. fejl når jeg vil slette en row i mit datagrid:

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

Min kode:

    // Delete row in DataGrid
    protected void dg_Delete(object sender, DataGridCommandEventArgs e) {
      try {
        if (!isEditing) {
          // the key value for this row is in the DataKeys collection
          string keyValue = (string)dg.DataKeys[e.Item.ItemIndex];
          SqlString = "DELETE FROM mailinglists WHERE ID = @ID";
          Response.Write(SqlString);

          CoreLab.MySql.MySqlConnection Conn = OpenMySqlConnection();
          MySqlCommand objCommand = new MySqlCommand(SqlString, Conn);
          objCommand.Parameters.Add("@ID", MySqlType.Int).Value = dg.DataKeys[(int)e.Item.ItemIndex];

          // execute the command
          Conn.Open();
          objCommand.ExecuteNonQuery();
          Conn.Close();

          // rebind the grid
          dg.CurrentPageIndex = 0;
          dg.EditItemIndex = -1;
          dg_Bind();
        }
      }
      catch(Exception handledException) {
        Response.Write(handledException.Message);
      }
    }
Avatar billede pelkjaer Nybegynder
10. november 2003 - 15:40 #1
keyValue er et gammelt levn kan jeg se - det skal der ses bort fra.
Avatar billede odegaard Nybegynder
10. november 2003 - 15:57 #2
Det lugter lidt af at (int)e.Item.ItemIndex ikke lige indeholder hvad du tror den indeholder.

Du sørger vel for at Page_Load ikke lave en databind ved postback?
Avatar billede pelkjaer Nybegynder
10. november 2003 - 16:00 #3
Det skulle jeg mene ja

      if(!(IsPostBack)) {
        // Run function
        dg_Bind();
      }
Avatar billede pelkjaer Nybegynder
10. november 2003 - 16:03 #4
Men hvordan tester jeg det for "fejl"?
Avatar billede odegaard Nybegynder
10. november 2003 - 16:07 #5
Prøv at lave en
Response.Write("Item clicked:" + e.Item.ItemIndex.ToString());
Så kan du verificere at du ikke forsøger at vælge et Index i dg.DataKeys der ikke eksisterer.
Er det i det hele taget i denne linje at du får fejlen?
Avatar billede pelkjaer Nybegynder
10. november 2003 - 16:20 #6
Jeg får udskrevet

Item clicked: 0
Item clicked: 1
Item clicked: 2
osv fra toppen af mit grid.

Hvor fejlen præcist kommer fra ved jeg ikke - men det kan næsten ikke være andet.

Stacktrace:

[ArgumentOutOfRangeException: Index was out of range.  Must be non-negative and less than the size of the collection.
Parameter name: index]
  System.Collections.ArrayList.get_Item(Int32 index) +91
  System.Web.UI.WebControls.DataKeyCollection.get_Item(Int32 index) +10
  emotor.builder.maillist.mailist_members.dg_Delete(Object sender, DataGridCommandEventArgs e) +197
  System.Web.UI.WebControls.DataGrid.OnDeleteCommand(DataGridCommandEventArgs e) +110
  System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +589
  System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
  System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +100
  System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
  System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +120
  System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +115
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
  System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +138
  System.Web.UI.Page.ProcessRequestMain() +1263
Avatar billede odegaard Nybegynder
10. november 2003 - 16:43 #7
Prøv at udkommentér din try/catch. Så får du den præcise linje.
Der er jo reelt to steder det kan gå galt:
string keyValue = (string)dg.DataKeys[e.Item.ItemIndex];
eller
objCommand.Parameters.Add("@ID", MySqlType.Int).Value = dg.DataKeys[(int)e.Item.ItemIndex];

...men det nok er den første.
Tjek lige på samme måde om (dg.DataKeys.Count-1) < e.Item.ItemIndex ?
Det er ihvertfald mit bedste bud på hvad fejlen er.
Avatar billede pelkjaer Nybegynder
10. november 2003 - 16:53 #8
det prøver jeg :)
Avatar billede odegaard Nybegynder
10. november 2003 - 16:55 #9
eller rettere HVOR fejlen er. Hvorfor Count-1 lige skulle være være mindre fatter jeg ikke
Avatar billede pelkjaer Nybegynder
11. november 2003 - 08:42 #10
Jeg vil næsten ikke sige hvad jeg gjorde forkert *LOOL*

Jeg satte DataKeyField forkert...

Smid et svar du :o)
Avatar billede odegaard Nybegynder
11. november 2003 - 17:45 #11
It happens :-)
Avatar billede pelkjaer Nybegynder
12. november 2003 - 08:20 #12
takker ;o))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester