Avatar billede simsen Mester
17. december 2006 - 15:57 Der er 9 kommentarer og
1 løsning

Slette en bestemt række i en accessdatabase

Hej,

Nu har jeg forsøgt med alt muligt de sidste par timer, uden det er lykkes.... Jeg har en Repeater, hvor jeg lister navne fra en tabel. Udfor navnene lister jeg en linkbutton, som jeg så vil have, når jeg trykker på den, skal den slette det pågældende navn i databasen....

Det sidste jeg har forsøgt med er sådan her:

aspx filen:

<asp:Repeater runat="server" id="repeaterVisAlle">
                    <HeaderTemplate>
                        <!-- bliver udskrevet en gang, før "listen" -->
                        <table width="100%" border="0" style="width: 240px">
                    </HeaderTemplate>
                    <itemTemplate>
                            <tr>
                                <td style="width: 100px; text-align: left; vertical-align: top;">                                   
                                    <i><%# DataBinder.Eval(Container.DataItem, "fornavn")%> <%# DataBinder.Eval(Container.DataItem, "efternavn")%></i>
                                </td>
                                <td style="width: 150px; text-align: left;; vertical-align: top;">
                                    <asp:LinkButton ID="lbtnDeleteUser" CausesValidation="true" OnCommand="DeleteUser" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "fornavn")%>' runat="server" EnableViewState="true">Slet</asp:LinkButton>                                   
                                </td>
                            </tr>
                    </itemTemplate>
                    <FooterTemplate>
                        <!-- Bliver udskrevet til sidst-->
                        </table>
                    </FooterTemplate>
                </asp:Repeater>

aspx.cs filen:

public void DeleteUser(object sender, EventArgs e)
    {
        lblTest.Visible = true;
        string navn = lbtnDeleteUser.CommandArgument;
    }

Når jeg forsøger at køre ovennævnte, får jeg følgende fejl:

The name 'lbtnSlet' does not exist in the current context

Hvad skal jeg helt nøjagtig gøre, for at komme ind i DeleteUser, med argumentet "mads", hvis det er Mads' navn der bliver valgt?

mvh
simsen :-)
Avatar billede sneakraid Nybegynder
17. december 2006 - 16:36 #1
Den måde du kan gøre det på er ved at lytte på ItemCommand eventet, som repeateren har. Sådan her:

Source:

<asp:Repeater runat="server" ID="repeaterVisAlle" ItemCommand="Repeater1_ItemCommand">

LinkButton:

<asp:LinkButton ID="lbtnDeleteUser" CausesValidation="true" CommandName="DeleteUser" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "UserID")%>' runat="server" EnableViewState="true">Slet</asp:LinkButton>

Codebehind:

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
        if (e.CommandName.Equals("DeleteUser"))
        {
            // Response.Write(e.CommandArgument.ToString());
            // Slet brugeren her. Du har hans ID gennem CommandArgument.
        }
    }
}

Lige en ting omkring CommandArgument på din LinkButton, der er det nok ikke så smart at bruge brugerens fornavn, hvad nu hvis der er flere der har det samme fornavn, så sletter du jo alle dem som hedder Mads f.eks. Så er det bedre hvis du bruger deres unikke ID fra db'en.
Avatar billede kalp Novice
17. december 2006 - 16:55 #2
I det kode du har vist os der findes 'lbtnSlet'  trods alt ikke så hvis det er at koden så giver det mening;o)

om ikke andet hvis den er der et sted så husk at skrive public foran den! hvis det er en variabel
Avatar billede simsen Mester
17. december 2006 - 17:56 #3
arghhhhhh har lige skrevet en roman og så er det bare væk.......
Avatar billede kalp Novice
17. december 2006 - 17:57 #4
Altid skrive i wordpad eller notepad og kopir herind hvis man skal skrive meget=)
Avatar billede simsen Mester
17. december 2006 - 18:01 #5
sneakraid

Der fandtes ikke nogen ItemCommand, så jeg brugte istedet OnItemCommand. Det går også nogenlunde godt....... I min database har jeg 3 rækker med navne, Hans Hansen, Jens Jensen og Lars Larsen.

Når jeg trykker på slet udfor Hans Hansen og Lars Larsen, udskriver den fint fornavnene, men der sker intet, når jeg trkker på slet udfor Jens Jensen. Forsøger jeg at debugge med en "run to curser", kan jeg se, at den slet ikke går ind i første if statement. Altså det er åbenbart ikke en ListItemType.Item??????

Min kode ser ud som følgende nu:
Source:
asp:Repeater runat="server" id="repeaterVisAlle" OnItemCommand="Repeater1_ItemCommand">
                    <HeaderTemplate>
                        <!-- bliver udskrevet en gang, før "listen" -->
                        <table width="100%" border="0" style="width: 240px">
                    </HeaderTemplate>
                    <itemTemplate>
                            <tr>
                                <td style="width: 100px; text-align: left; vertical-align: top;">                                   
                                    <i><%# DataBinder.Eval(Container.DataItem, "fornavn")%> <%# DataBinder.Eval(Container.DataItem, "efternavn")%></i>
                                </td>
                                <td style="width: 150px; text-align: left;; vertical-align: top;">
                                    <asp:LinkButton ID="lbtnDeleteUser" CausesValidation="true" CommandName="DeleteUser" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "fornavn")%>' runat="server" EnableViewState="true">Slet</asp:LinkButton>                                   
                                </td>
                            </tr>
                    </itemTemplate>
                    <FooterTemplate>
                        <!-- Bliver udskrevet til sidst-->
                        </table>
                    </FooterTemplate>
                </asp:Repeater>

Codebehind:
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            if (e.CommandName.Equals("DeleteUser"))
            {
                // Response.Write(e.CommandArgument.ToString());
                // Slet brugeren her. Du har hans ID gennem CommandArgument.
                string name = e.CommandArgument.ToString();
               
                lblTest.Visible = true;
                lblTest.Text = name;
            }
        }
    }

Mht. CommandArgument er fornavn, så ved jeg godt, det ikke er smart. Nu er jeg bare igang med at omskrive min hjemmeside fra asp til asp.net, hvor jeg viser et eksempel på at slette fra en tabel. Så jeg ved, der altid kun er 3 navne i tabellen, og at der ikke er redundanter i de navne.

mvh
simsen :-)
Avatar billede simsen Mester
17. december 2006 - 18:02 #6
kalp

Sikke mange gode råd du har.....håber der snart kommer et, der også kan hjælpe mig ;-)
Avatar billede simsen Mester
17. december 2006 - 18:23 #7
Hmmmm

Den opfører sig underligt......

Nu har jeg forsøgt at lave en slet funktion til den:

//sletter i tabellen SletData
    public void SletBruger(string fornavn)
    {
        command.CommandText = "DELETE fornavn, efternavn FROM SletData WHERE fornavn = @fornavn";
       
        command.Parameters.Clear();
        command.Parameters.AddWithValue("@fornavn", fornavn);

        command.ExecuteNonQuery();
    }

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            if (e.CommandName.Equals("DeleteUser"))
            {
                // Response.Write(e.CommandArgument.ToString());
                // Slet brugeren her. Du har hans ID gennem CommandArgument.
                string name = e.CommandArgument.ToString();

                eksempler.SletBruger(name);
                //Opretter ny instans af GetHentDataAlt fra Eksempler
                DataTable visalle = eksempler.VisSletData();

                repeaterVisAlle.DataSource = visalle;
                repeaterVisAlle.DataBind();
                //lblTest.Visible = true;
                //lblTest.Text = name;
            }
        }
    }

Jeg trykker så på Slet buttonlinket udfor det første navn, og den sletter pænt og genopfrisker også - så der kun står de sidste to navne......Forsøger jeg så at bruge en F5 altså Refresh siden, så sletter den den næste på listen?

mvh
simsen :-)
Avatar billede sneakraid Nybegynder
17. december 2006 - 19:04 #8
Et "hurtigt hack" er vel at databinde din repeater i Page_Load (kun hvis det ikke er postback) og så lave en Response.Redirect() når du har slettet.
Avatar billede simsen Mester
17. december 2006 - 21:12 #9
Kan ikke lave en Response.Redirect, da den så ikke opdaterer indholdet i min Repeater... og laver jeg det uden Response.Redirect, fremkommer samme fejl
Avatar billede simsen Mester
29. december 2006 - 09:43 #10
lukker denne...
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