Avatar billede laurits Nybegynder
25. april 2005 - 10:37 Der er 23 kommentarer og
1 løsning

Sletning fra DataGrid

Jeg forsøger at slette en række fra et DataGrid.
Er der nogen der kan se hvad der er galt med denne methode:
private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            int rowToDelete = e.Item.ItemIndex;
            string deleteCmd = "DELETE from Users WHERE UserID = @UserID";
               
            OdbcCommand myCommand = new OdbcCommand(deleteCmd, odbcConn);
            myCommand.Parameters.Add(new OdbcParameter("@UserId", OdbcType.NVarChar, 11));
            myCommand.Parameters["@UserId"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];

            DataGrid1.DataBind();           
        }
Når jeg forsøger at slette fra DataGrid for jeg denne fejl, som jeg ikke lige helt fatter så meget af:
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
Avatar billede lifo Nybegynder
25. april 2005 - 13:56 #1
ved ikke om det har noget at gøre med at du har UserID og UserId
Avatar billede laurits Nybegynder
25. april 2005 - 14:29 #2
ja den fejl har jeg også fundet. Jeg var så optaget af kigge i C# koden at jeg ikke så fejlen i SQL'en.  :-)  DOH!
Avatar billede lifo Nybegynder
25. april 2005 - 23:23 #3
og hvad betyder det
at det var løsningen
eller at der var en anden fejl ?
Avatar billede laurits Nybegynder
26. april 2005 - 08:32 #4
ja undskyld at jeg ikke lige fik givet et ordentlig svar.
Både ja og nej, for Sql'en løste et problem men jeg kan stadig ikke få slettet en række i tabellen når der trykkes på 'delete' på griddet.
Kan ikke lige finde ud af at hente de parametre der fortæller hvilken række der trykkes på. Men har forsøgt med:
myCommand.Parameters.Add(new OdbcParameter("@Id", OdbcType.NVarChar, 11));
            myCommand.Parameters["@Id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];

der så skal kalde metoden (i en anden klasse)
public void deleteRow(string tableName, string delcom)
        {   
           
            myCommand = new OdbcCommand(delcom, odbcConn);
            myReader = myCommand.ExecuteReader();
            myReader.Close();
            odbcConn.Close();
        }
public void deleteRow(string tableName, string delcom)
        {   
           
            myCommand = new OdbcCommand(delcom, odbcConn);
            myReader = myCommand.ExecuteReader();
            myReader.Close();
            odbcConn.Close();
        }
Avatar billede laurits Nybegynder
26. april 2005 - 08:32 #5
ups, kun èn gang sæ'fø'li....
Avatar billede nielle Nybegynder
26. april 2005 - 09:43 #6
1) I dit oprindelige tilfælde, gør du meget ud af at oprette din myCommand, men så vidt jeg kan se så eksekvere du den aldrig. Jeg forstår ikke hvorfor dette skulle give din en index-fejl.

2) I dit indlæg 26/04-2005 08:32:12 bruger du en ExecuteReader() til at udføre en delete-kommando med. Det ville virke, men det er nu mere korrekt at bruge ExecuteNonQuery() i stedet.
Avatar billede laurits Nybegynder
28. april 2005 - 19:58 #7
Hej igen.
nielle -> 1) for at gøre en lang historie kort hat jeg måtte droppe min oprindelige idé.
2) jeg kan ikke bruge ExecuteNonQuery()da der ikke kan konverter en 'int' til Odbc.OdbcDataReader.

Dog har jeg fundet ud at jeg KAN slette i DB. Koden nedenfor viser at det er muligt at slette rækken i tabellen hvor X11 er.

private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {           
            dbcon = new DBConnection();
            del = "DELETE from PLACE WHERE PLACEID = 'X11'";
//            myCommand.Parameters.Add(new OdbcParameter("@Id", OdbcType.NVarChar, 11));
//            myCommand.Parameters["@Id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
            dbcon.deleteRow(tableName, del);
        }

Dog vil jeg gerne kunne slette på en tilfældig række man trykker på.
Det kan fikses med noget lign. som den udkommenterede del. Ved bare ikke hvordan?
Nogen ideer?
Avatar billede nielle Nybegynder
28. april 2005 - 20:05 #8
Sådan her skal det se ud med ExecuteNonQuery():

public void deleteRow(string tableName, string delcom)
{   
    myCommand = new OdbcCommand(delcom, odbcConn);
    myCommand.ExecuteNonQuery();
    odbcConn.Close();
}
Avatar billede laurits Nybegynder
28. april 2005 - 20:17 #9
kanon, det var et problem mindre. Hvad er forskellen lige?
Avatar billede nielle Nybegynder
28. april 2005 - 20:54 #10
ExecuteReader() - bruges når man har bruge for at hente data og loope igennem en masse rækker. Bruges sammen med en SELECT som returnere et ukent antal rækker. Du er nødt til at have en xxxxReader for at "tage imod" resultatet

ExecuteNonQuery() – bruges når man blot skal have udført en SQL kommando og ikke skal have noget resultat tilbage. Bruges sammen med DELETE og UPDATE. Da den ikke retunere noget, skal man heller ikke bruge en xxxxReader.

ExecuteScalar() - bruges når man har en SQL sætbning som kun returnere en enkelt værdi - f.eks. "SELECT count(*) FROM ...". Da resultatet er en scalar skal resultatet samles op i en passende type:

SQL = "SELECT count(*) FROM tabel";
Int32 Count = (Int32) myCommand.ExecuteScalar();
Avatar billede laurits Nybegynder
28. april 2005 - 21:11 #11
nielle, du har forslag til hvordan jeg for slettet en række i en tabel, når man trykker på delete inde i datagrid'et?
Avatar billede nielle Nybegynder
28. april 2005 - 21:24 #12
Har du prøvet:

System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    string deleteCmd = "DELETE from Users WHERE UserID = @UserID";

    OdbcCommand myCommand = new OdbcCommand(deleteCmd, odbcConn);
    myCommand.Parameters.Add(new OdbcParameter("@UserId", OdbcType.NVarChar, 11));
    myCommand.Parameters["@UserId"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
    myCommand.ExecuteNonQuery();

    DataGrid1.DataBind();
}
Avatar billede nielle Nybegynder
28. april 2005 - 21:25 #13
...og ellers har jeg desværre ikke lige noget foreslag. Plejer ikke at arbejde med DataGrid.
Avatar billede nielle Nybegynder
28. april 2005 - 21:26 #14
Hov, 1. linje smuttede lige:

private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    string deleteCmd = "DELETE from Users WHERE UserID = @UserID";

    OdbcCommand myCommand = new OdbcCommand(deleteCmd, odbcConn);
    myCommand.Parameters.Add(new OdbcParameter("@UserId", OdbcType.NVarChar, 11));
    myCommand.Parameters["@UserId"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
    myCommand.ExecuteNonQuery();

    DataGrid1.DataBind();
}
Avatar billede laurits Nybegynder
28. april 2005 - 22:00 #15
ja men jeg får en fejl i linien:
myCommand.Parameters["@UserId"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];

Fejeln lyder "must be non-negative and less than the size og the collection. Parameter name: index"
Avatar billede nielle Nybegynder
28. april 2005 - 22:32 #16
Så er jeg desværre blank. Måske skulle du stille spørgsmålet på ASP.NET kategorien i stedet.
Avatar billede laurits Nybegynder
28. april 2005 - 22:36 #17
hmm go' idé.
Det prøver jeg. Tak for din assistance.
Avatar billede nielle Nybegynder
29. april 2005 - 06:50 #18
Avatar billede nielle Nybegynder
02. maj 2005 - 21:35 #19
Lukketid?
Avatar billede laurits Nybegynder
02. maj 2005 - 23:35 #20
ja ehh hvordan gør jeg lige det, når jeg ikke kan afgive nogen point?
Avatar billede nielle Nybegynder
03. maj 2005 - 06:55 #21
Enten beder du en af os om at svare, eller også lægger du selv et svar. Derefter akceptere du svaret.
Avatar billede laurits Nybegynder
03. maj 2005 - 10:04 #22
jamen så synes jeg da du skal give mig et svar nielle, og få nogle point :-)
Avatar billede nielle Nybegynder
03. maj 2005 - 18:05 #23
Svar :^)
Avatar billede nielle Nybegynder
03. maj 2005 - 21:57 #24
Takker for point :^)
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