Avatar billede anders_cp Nybegynder
07. december 2009 - 16:50 Der er 9 kommentarer og
1 løsning

Forhindre dobbeltklik i <asp:hyperlink

Hejsa
Jeg har problemer med at folk dobbeltklikker, derfor ønsker jeg at forhindre dette.

Det er en asp .net 1.1 C# side på asp .net 2.0 frameworket.

*.aspx (ligger i en iframe ***)
---------------------------
<%@ Page Language="c#" Codebehind="Parts2.aspx.cs" AutoEventWireup="false"
Inherits="Website.CSM.Activity.Parts2" %>

/*
Jeg ved ikke om AutoEventWireup="false" har betydning
*/
  <asp:HyperLink  ID="HyperLinkOrder" runat="server" CssClass="LinkButton">Bestil</asp:HyperLink>



Any ideas?







***
<%@ Page Language="c#" Codebehind="Activity.aspx.cs" AutoEventWireup="false" Inherits="ServicePartner.Website.Csm.Activity.Activity"
    EnableEventValidation="false" %>

                <MS:PAGEVIEW>
                    <!-- Reservedele -->
                    <div>
                        <!-- PARTS -->
                        <iframe id="IframeParts" frameborder="no" width="100%" height="100%" runat="server">
                        </iframe>
                    </div>
                </MS:PAGEVIEW>
Avatar billede anders_cp Nybegynder
07. december 2009 - 18:56 #1
Lige lidt ekstra info.
Jeg har googlet min frem til tilføje en attribut, og har i page_prerender skrevet flg. som IKKE virker:

            if (LinkButtonEdit.Text == "Rediger")
                LinkButtonEdit.Attributes.Add("onclick", " this.disable = true; "
                    + ClientScript.GetPostBackEventReference(LinkButtonEdit, null) + ";");
Avatar billede mireigi Novice
08. december 2009 - 12:41 #2
Du kan bruge det her i stedet for:

<html>
<head>

    <script type="text/javascript">
    function disableLink(linkid)
    {
        var link = document.getElementById(linkid);
        var url = link.href;
        link.href = "";
        setTimeout("enableLink('" + linkid + "','" + url + "')", 1500);
    }
   
    function enableLink(linkid, url)
    {
        var link = document.getElementById(linkid);
        link.href = url;
    }
    </script>

</head>
<body>
    <a href="http://www.google.dk" target="_blank" onclick="disableLink(this.id)" id="link1">Link</a>
</body>
</html>


<a href onclick="disableLink(this.id)"...>

omskrives til:

<ASP:LinkButton onclick="disableLink(this.id)"...>
Avatar billede anders_cp Nybegynder
09. december 2009 - 11:34 #3
hmm jeg kan ikke få dit forslag til at virke. Har lavet en hml-fil med dit forslag.

Det hedder vel:
OnClientClick="disableLink(this.id)" og ikke OnClick ?

Jeg ønsker ingen timeout. Jeg ønsker at knappen bliver disabled og efter diverste databasekald og funktioner i code-behind-filen er udført skal knappen eller en anden knap enables,  så det forhindres at brugeren klikker to gange.

Her er et eksempel på hvad jeg ønsker
http://www.asp101.com/tips/index.asp?id=135

der er bare det aber dabei ved eksemplet at  det er en input-knap og ikke  <asp:HyperLink (eller <ASP:LinkButton ), og at eksemplet ikke beskriver hvordan jeg skal kunne udføre en code-behind-fuktion når der klikkes.
Avatar billede mireigi Novice
09. december 2009 - 12:46 #4
Det er nok det her du skal bruge så:

Eksempel på form:


    <form id="form1" runat="server">
    <div>
            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
    </div>
    </form>


Eksempel på code-behind

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            lb.Enabled = false;
            /*
            Her kalder du dit database halløj
            */
            lb.Enabled = true;
        }
Avatar billede anders_cp Nybegynder
09. december 2009 - 16:09 #5
Mange tak, det virker som lidt af det jeg skal bruge, men desværre virker det ikke. Jeg kan stadig trykke flere gange.
Hvis man kunne give en besked til brugeren om at han skal holde nallerne væk, ville det også være fint.

Nedenståend viser knappen hvor jeg har lagt lagt dit forslag til:
Funktionen SaveActivity() laver en masse og det er muligvis her der sker problemer, når man trykker flere gange.


private void LinkButtonEdit_Click(object sender, System.EventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
           
            if(editMode)
            {
                lb.Enabled = false;
                if(SaveActivity())
                {
                    string offerString = (TextBoxOffer.Text).Replace(".", ",");
                    string rejectedofferString = (TextBoxRejectOffer.Text).Replace(".", ",");
                    activity = GetActivity(activity.ActivityID);
                    decimal tmpOffer = (TextBoxOffer.Text == "" ? 0 : Convert.ToDecimal(offerString));
                    decimal tmpReject = (TextBoxRejectOffer.Text == "" ? 0 : Convert.ToDecimal(rejectedofferString));
                    SavePaymentPrices(activity.ActivityID, tmpOffer,tmpReject);
                    LabelOfferVat.Visible = false; LabelOfferRejectVat.Visible = false;
                    //UpdatePaymentPrices();
                    LinkButtonEdit.Text = "Rediger";
                    HyperLinkPrint.Visible = true;
                    editMode = false;
                    loadData = true;
                }
                else
                {
                    loadData = false;
                }
            }
            else
            {
                LinkButtonEdit.Text = "Gem";
                HyperLinkPrint.Visible = false;
                editMode = true;
                loadData = true;
            }
            lb.Enabled = true;
        }
Avatar billede mireigi Novice
10. december 2009 - 09:15 #6
Prøv med det her i stedet for:


private void LinkButtonEdit_Click(object sender, System.EventArgs e)
        {
            LinkButtonEdit.Enabled = false;
            if(editMode)
            {
                if(SaveActivity())
                {
                    string offerString = (TextBoxOffer.Text).Replace(".", ",");
                    string rejectedofferString = (TextBoxRejectOffer.Text).Replace(".", ",");
                    activity = GetActivity(activity.ActivityID);
                    decimal tmpOffer = (TextBoxOffer.Text == "" ? 0 : Convert.ToDecimal(offerString));
                    decimal tmpReject = (TextBoxRejectOffer.Text == "" ? 0 : Convert.ToDecimal(rejectedofferString));
                    SavePaymentPrices(activity.ActivityID, tmpOffer,tmpReject);
                    LabelOfferVat.Visible = false; LabelOfferRejectVat.Visible = false;
                    //UpdatePaymentPrices();
                    LinkButtonEdit.Text = "Rediger";
                    HyperLinkPrint.Visible = true;
                    editMode = false;
                    loadData = true;
                }
                else
                {
                    loadData = false;
                }
            }
            else
            {
                LinkButtonEdit.Text = "Gem";
                HyperLinkPrint.Visible = false;
                editMode = true;
                loadData = true;
            }
            LinkButtonEdit.Enabled = true;
        }


Men dette vil kun deaktivere knappen mens der bliver lavet et postback. Evt. kan du bruge dette sammen med:
<ASP:LinkButton OnClientClick="this.enabled=false;" />

Så burde knappen blive deaktiveret indtil der er sket et postback.
Avatar billede anders_cp Nybegynder
10. december 2009 - 21:30 #7
OnClientClick="this.enable=false" skete der ikke noget ved. Ellers har jeg prøvet adskellige kombinationer uden held.

Hvis jeg bruger nedenstående, men ikke enabler knappen kan jeg se det virker. Det oprindelige problem med at databasen blev kaldt flere gange, har jeg fået løst, så brugeren kan ikke ødelægge noget ved at klikke flere gange... lige her. Der er nemlig flere steder hvor det skaber problemer og da systemet kører ekstremt langsom ville det være rart at kunne disable eller skrive "arbejder.." på knappen.

Problemet tror jeg ligger i en masse postback der bliver udført. Det er en popup med pageview og tabs indeholdende iframes  plus kilometerlang kode og det er noget rigtig skidt.

Udenfor denne popup har jeg løst problemet sådan i Page_load:
Button1.Attributes.Add("onclick", " this.disabled = true; "+ ClientScript.GetPostBackEventReference(Button1,null)+";");

http://forums.asp.net/t/1061648.aspx
.. og det virker fint.

Du har hjulpet meget selvom problemet endnu ikke er løst, så du må sige til når du giver op, så vil jeg give dig point og håbe du måske kan hjælpe igen senere i en anden tråd.

Kan du fortælle mig forskellen på
LinkButton lb = (LinkButton)sender
lb.enable = false/true
og
LinkButtonEdit.Enable = false/true
??

Sådan er status, der ikke virker:

private void LinkButtonEdit_Click(object sender, System.EventArgs e)
        {
            if(editMode)
            {
                LinkButtonEdit.Enabled = false;
              // LinkButtonEdit.Text = "Arbejder...";
                if(SaveActivity())
                {
                    activity = GetActivity(activity.ActivityID);
                    LabelOfferVat.Visible = false; LabelOfferRejectVat.Visible = false;
                    LinkButtonEdit.Text = "Rediger";
                    HyperLinkPrint.Visible = true;
                    editMode = false;
                    loadData = true;
                }
                else
                {
                    loadData = false;
                }
            }
            else
            {
                LinkButtonEdit.Text = "Gem";
                HyperLinkPrint.Visible = false;
                editMode = true;
                loadData = true;
            }
            LinkButtonEdit.Enabled = true;
        }
Avatar billede mireigi Novice
11. december 2009 - 15:57 #8
Der er ikke nogen forskel.

LinkButton lb = (LinkButton)sender
lb.enable = false/true

tager sender fra input parametrene til metoden og laver om til en LinkButton der gemmes i variablen lb som du bagefter kan manipulere. sender vil, i dette tilfælde, altid være den knap du har trykket på.


LinkButtonEdit.Enable = false/true
Metoden du kalder bruges kun af LinkButtonEdit, så derfor ved du også at det er den knap du skal ændre. Der er altså ingen grund til at konvertere sender til en LinkButton først. Du kan bare manipulere knappen direkte.

Håber det gav lidt mening. Hvad angår dit problem med dobbeltklik så burde følgende virke:
<ASP:LinkButton onclick="this.disabled='disabled';" ... />

Det jeg skrev tidligere med at disable knappen i code-behind vil ikke virke i det her tilfælde alligevel. Du disabler knappen OG enabler den igen i samme postback, der sker altså ingen ændring. Derfor er du nødt til at gøre det på front-end med javascript.

Det skal dog siges at det mest normale, og hvad jeg finder mest korrekt, er at have én side til din formular og én side hvor du fx siger "tak for din registration" eller andet. Er det en opdatering af oplysninger bør man blive sendt tilbage til profilsiden, og altså ikke tilbage til formen.
Avatar billede anders_cp Nybegynder
14. december 2009 - 16:58 #9
Mange tak for dit svar. Det giver mening.

<i>
Det skal dog siges at det mest normale, og hvad jeg finder mest korrekt, er at have én side til din formular og én side hvor du fx siger "tak for din registration" eller andet. Er det en opdatering af oplysninger bør man blive sendt tilbage til profilsiden, og altså ikke tilbage til formen.
</i>

Ja deri er jeg enig, problemet er at det er noget kode jeg har "arvet". Men måske jeg skulle finde ud af at opdele koden lidt.
Avatar billede anders_cp Nybegynder
14. december 2009 - 16:58 #10
nåh <i></i> virker ikke, kan jeg se ;)
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