2012-01-04 13 views
12

Si consideri il seguente:Come fare doppio clic e singolo evento per il pulsante di collegamento del controllo Asp.net?

protected void dgTask_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     LinkButton btn = (LinkButton)e.Row.Cells[4].FindControl("lnkBtnEdit"); 

     btn.Attributes.Add("onclick", "return Test();"); 
    } 
} 

Invece di un click, come posso farlo doppio click mentre si fa clic sul pulsante di collegamento?

cura

ho provato con la soluzione presentata da * competent_tech * ma il problema è che in questo caso sarà intercettare il singolo clic.

Ho bisogno di fare qualche operazione con un clic e qualcos'altro con doppio clic. Mi aiuti per favore.

Grazie

+1

http://www.codeproject.com/KB/webforms/DoubleClickGridviewRow.aspx – Neha

risposta

13

Avresti per fare qualcosa di simile Questo.

Codice dietro.

Linkbutton btn; 
btn.Attributes.Add("onClick", "OnClick();"); 

poi nel vostro javascript è necessario definire la funzione OnClick come questo

var clickCount = 0; 
var timeoutID = 0; 

function OnClick() 
{ 
    clickCount++; 

    if (clickCount >= 2) { 
     clickCount = 0;   //reset clickCount 
     clearTimeout(timeoutID); //stop the single click callback from being called 
     DoubleClickFunction(); //perform your double click action 
    } 
    else if (clickCount == 1) { 
     //create a callback that will be called in a few miliseconds 
     //the callback time determines how long the user has to click a second time 

     var callBack = function(){ 
         //make sure this wasn't fired at 
         //the same time they double clicked 
         if (clickCount == 1) {  
          clickCount = 0;   //reset the clickCount 
          SingleClickFunction(); //perform your single click action 
         } 
         }; 

     //This will call the callBack function in 500 milliseconds (1/2 second). 
     //If by that time they haven't clicked the LinkButton again 
     //We will perform the single click action. You can adjust the 
     //Time here to control how quickly the user has to double click. 
     timeoutID = setTimeout(callBack, 500); 
    } 
} 

è possibile mettere il javascript direttamente nel file aspx o aggiungere dinamicamente quando si aggiunge il LinkButton alla pagina. Se è necessario eseguire un'azione sul lato server quando l'utente fa clic singoli o doppio clic è possibile utilizzare il metodo __doPostBack. Vedi here per maggiori informazioni su questo.

Il problema con il mio approccio è che l'utente dovrà sempre attendere l'intero tempo di richiamata prima che venga eseguita l'azione di clic singolo. Non vedo alcun modo intorno a questo finché si utilizza solo clic/doppio clic per distinguere ciò che l'utente desidera. Se ritieni che questo ritardo sia troppo grande di un problema, puoi sempre provare qualcosa come clic/MAIUSC + clic per alternare le azioni. Probabilmente non sarebbe così intuitivo in questo modo, ma sapresti immediatamente cosa vuole l'utente e potresti rispondere immediatamente anziché aspettare di vedere se l'utente fa clic una seconda volta.

Fatemi sapere se avete domande.

4

Provare a utilizzare ondblclick invece di onclick.

Per fare questo lavoro in modo corretto, si hanno anche per intercettare onclick e restituire false in modo che la navigazione automatica non avviene:

 LinkButton1.Attributes.Add("ondblclick", @"alert('test');"); 
     LinkButton1.Attributes.Add("onclick", @"return false;"); 
+0

no non funziona .. Ho provato btn.Attributes.Add ("ondblclick", "ritorno Test();"); – user1025901

+0

Puoi chiarire un po '? Non funziona perché spara al primo clic o? –

+0

No non sono in grado di eseguire alcuna azione che ero in grado di fare con onclick – user1025901

0

cercare di ottenere il conteggio del click e cercare di eseguire un'operazione . Penso che ondbclick può essere implementato tramite javascript.

int count = 0; 
if(btn.Click == true) 
{ 
    count++; 
    if(count == 2) 
    { 
     // Perform the logic here 
    } 
} 

EDIT: Cosa competent_tech dire è right.you in grado di eseguire questa logica

+0

in nessun modo, cosa succede se scatta quelle ora e quelle dopo 20 secondi? è questo doppio clic? – Aristos

0

incolla il codice in Page_Load che funzionerà

LinkButton1.Attributes.Add("ondblclick","yourfunction()"); LinkButton1.Attributes.Add("onclick", @"return false;");

+0

Questo approccio vanifica lo scopo di eseguire alcune azioni con un solo clic e qualcos'altro con doppio clic. – user1025901

8

Risposta breve: No, non puoi farlo.

Risposta lunga: non è possibile farlo perché un doppio clic è effettivamente 2 clic singoli. Ci sono un sacco di hack (come gli approcci basati su timer) che puoi trovare quale tentativo di fare, ma se li scegli, sii consapevole che questo sarà sempre un comportamento non affidabile e rischioso.

Come da quirksmode.org, ecco la sequenza di eventi per un doppio clic:

  1. mousedown
  2. mouseup
  3. click
  4. mousedown
  5. mouseup
  6. click
  7. DoppioClic

Anche questo ordine non è coerente tra i browser. Non esiste un modo semplice e affidabile per rilevare sia il clic che il doppio clic sullo stesso elemento.

Citando quirksmode.org:

Non sei registrato clicca e DoppioClic eventi sullo stesso elemento: è impossibile distinguere un solo clic gli eventi da eventi click che portano a un evento DoppioClic.

E per jQuery:

Si sconsiglia di legarsi i gestori sia al clic e DoppioClic eventi per lo stesso elemento. La sequenza di eventi innescati varia da da browser a browser, con alcuni eventi di due clic ricevuti prima di il dblclick e altri solo uno. La sensibilità del doppio clic (tempo massimo tra tra clic che viene rilevato come doppio clic) può variare a seconda del sistema operativo e del browser ed è spesso configurabile dall'utente.

La soluzione migliore è riprogettare il flusso di lavoro in modo da utilizzare qualcos'altro (piuttosto che numero di clic) su cui fare affidamento.

+0

Non solo gli eventi che contano, è anche necessario posizionare su, il limite di tempo che tutto ciò deve essere fatto e le distanze dei pixel tra questi due clic. – Aristos

+0

@Aristos: esattamente. La citazione di jQuery riassume bene il motivo per cui il limite di tempo potrebbe non funzionare. Grazie per averne estratto la parte. – Mrchief

0

Ho inserito qui il codice javascript di esempio.

http://jsbin.com/ubimol/2/edit

Html:

<input id="sin" type="button" value="Edit" onclick="singleClick();return false;"/> 
    <input id="dou" style="display:none" type="button" value="Edit" onclick="doubleClick();return false;" /> 

Javascript:

var isDoubleClick = false; 
function singleClick(){ 
    $("#sin").hide();$("#dou").show(); 

    //wait for 500 milliseconds. 
    setTimeout("waitForSecondClick()", 500); 


} 


    function waitForSecondClick(){ 
    if(isDoubleClick == false){ 
     alert("this is a sinle click event, perform single click functionality"); 
     } 

     isDoubleClick = false; //Reset 
     $("#sin").show();$("#dou").hide(); 
    } 

    function doubleClick(){ 
     isDoubleClick = true; 

     alert("this is a double click event, perform double click funcitonality"); 



    } 

Introducendo secondo pulsante con lo stesso valore, la soluzione è stabile, ma richiede un po 'di codice in più.

0

In prova la tua esempio di cui sopra, ho scoperto che la forma del GridView è contenuta in viene presentata ogni volta che si fa clic sul LinkButton . Per ovviare a questo ho usato il seguente codice.

Il seguente script verrà conteggiato ogni volta che l'utente fa clic sul collegamento.

<script type="text/javascript">  
    var clickNo = 0;  

    function clickCounter() {  
     clickNo++;  
     if (clickNo == 2) {  
      alert("Double Click");  
      clickNo = 0;  
     }  
    }  
</script>  

Annulliamo l'invio del modulo in modo da poter tenere traccia del numero di volte che l'utente fa clic sul collegamento. Ciò potrebbe causare problemi con la tua pagina, ma sembra essere il motivo per cui non è possibile tenere traccia dei doppi clic.

<form id="form1" runat="server" onsubmit="return false;">  

ho creato un campo modello in un controllo GridView per mostrare entrambi i tasti doppio click singolo scatto e.

<asp:TemplateField HeaderText="Edit">  
    <ItemTemplate>  
     <asp:LinkButton ID="lnkBtnEdit" runat="server">LinkButton</asp:LinkButton>  
     &nbsp;&nbsp;  
     <asp:LinkButton ID="lnkBtnEditDouble" runat="server">LinkButton</asp:LinkButton>  
    </ItemTemplate>  
</asp:TemplateField>  

Nel codice dietro la pagina che aggiungere il codice javascript per un singolo clic e il codice javascript per un doppio clic. Nota: il riferimento di cella è impostato su 2 mentre nel tuo esempio era 4, a causa delle colonne limitate che ho usato nei miei test.

try  
{  
    if (e.Row.RowType == DataControlRowType.DataRow)  
    {  
     // Please note: the value in Cells has changed for my testing data.  
     LinkButton btn = (LinkButton)e.Row.Cells[2].FindControl("lnkBtnEdit");  

     btn.Attributes.Add("onclick", "javascript:alert('Single Click');");  

     LinkButton btnDouble = (LinkButton)e.Row.Cells[2].FindControl("lnkBtnEditDouble");  

     btnDouble.Attributes.Add("onclick", "javascript:clickCounter();");  
    }  
}  
catch (Exception ex)  
{  
    Console.WriteLine(ex.Message);  
}  

Ciò dovrebbe consentire di acquisire doppio clic su alcuni collegamenti e singoli clic su altri. Tuttavia, come menzionato sopra, l'invio del modulo è ora annullato e dovrai trovare un altro metodo per inviare i tuoi dati se devi usare il codice sopra.

1

http://jsfiddle.net/XfJDK/2/

<div onClick="return OnClick();">click me</div> 
<div id="eventText">...</div> 

var clicks = 0; 

function OnClick() { 

    clicks++; 
    if (clicks == 1) 
     setTimeout("RunRealCode();", 300); // schedule real code, allowing for 300ms for 2nd optional click 

    setTimeout("clicks = 0;", 350); // click timeout of 300 + 50 ms 
} 

function RunRealCode() { 
     if (clicks == 2) 
      $("#eventText").text("Double").fadeOut().fadeIn(); 
     else if (clicks == 1) 
      $("#eventText").text("Single").fadeOut().fadeIn(); 
} 
Problemi correlati