Hej! Tror du kan göra det lite enklare... Tackar för svaret! Du kan skapa/bygga en serverkontroll där du lägger koden, sen använder du den knappen och drar in på alla dina formulär i stället. Japp, det är ju precis det jag frågar efter och behöver hjälp med....:) 1) Skapa en klass som ärver Button. Kör override på OnPreRender, lägg där till attributet för onclick, samt inkludera javascriptet på sidan med Page.ClientScript.Någont-Lämplig-Metod Hej, Om du måste skriva citattecken ("") i strängar i vb.net så måste du skriva dubbla cittattecken, dvs. för att skriva just: " så måste du skriva "". Det är det jag tror du gjort fel på. Ta dessutom och ersätt & chr-koden, den ser ful ut, är jobbig att läsa å drar ner prestandan ;) Oskar,Egen knapp?
Jag har ett par knappar där jag lagt in lite kod för att förhindra användaren från att kunna dubbelklicka på knappen.
Nu behövs detta göras på många ställen i applikationen och då tänkte jag att man kanske kunde göra en "egen" knapp som har dessa egenskaperna.
Problemet är att jag aldrig gjort någont sånt här.
Hur går man till väga? Jag antar att man börjar med att göra en klass som ärver "button", men sen tar det stopp.....
Koden på de enskilda knapparna ser ut så här:
btnSave.Attributes.Add("onclick", "DisableButton('" & btnSave.ClientID & "','Saving...');")
DisableButton är ett javascript som ligger i en extern js-fil och ser ut så här:
<code>
function DisableButton(btn,txt)
{
document.getElementById(btn).disabled = true;
document.getElementById(btn).value = txt;
__doPostBack(document.getElementById(btn).getAttribute('name'),"");
}
</code>
Den disablar alltså knappen och byter text(till "Saving..." i detta fall).
Så dena text bör man kunna ange i min "egna" knapp också.
Någon som kan hjälpa mig?
Jag kör VB.NET
/Jocke
Sv: Egen knapp?
sub knapptryck () ....
knapptryck.enabled = false
' utför lite rutiner här..
end subSv:Egen knapp?
Men....
1. För det första får jag inte det att funka riktigt.
2. Vitsen med "klient-disabling" är att det sker med en gång. Som du skriver tar det en liten(om än väldigt liten stund) innan den disablas. Så man hinner dubbelklicka innan den disablas.
3. Sen om jag gör det på klienten, när sidan laddats klart får knappen sitt ursprungliga tillstånd, vilket är precis vad jag vill. Den ska ju bara vara disablad under tiden server-koden körs.
4. Om jag gör som du, antar jag att jag även får ta hand om vad som ska hända med knappen efteråt, eller?
Helst vill jag nog göra som jag beskrev. Fast om jag skulle göra efter ditt exempel, hur får jag in detta i en "egen" knapp? Jag vill ju inte lägga in den koden på alla mina knappar.
/JockeSv: Egen knapp?
Sv:Egen knapp?
Hur gör man det? (se överst i min ursprungsfråga)
/JockeSv:Egen knapp?
Sv: Egen knapp?
Tackar.
Det funkar inte riktigt.
Nu har jag gjort en klass som ser ut så här:
Imports System
Imports System.Web.UI.WebControls
Namespace MyControls.Web.UI.WebControls
Public Class Knappen
Inherits Button
Private Shared functionName As String = "DisableButton"
Private _DisabledText As String = ""
Public Overridable Property DisabledText() As String
Get
Return _DisabledText
End Get
Set(ByVal Value As String)
_DisabledText = Value
End Set
End Property
Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
MyBase.OnPreRender(e)
Dim script As String
script = "<script language=" & Chr(34) & "javascript" & Chr(34) & " type=" & Chr(34) & "text/javascript" & Chr(34) & ">" & vbCrLf
script &= "function " & functionName & " (btn,txt) {" & vbCrLf
script &= "document.getElementById(btn).disabled = true;" & vbCrLf
script &= "document.getElementById(btn).value = txt;" & vbCrLf
script &= "__doPostBack(document.getElementById(btn).getAttribute('name'),"");"
script &= "} " & vbCrLf
script &= "</script>"
Me.Page.RegisterClientScriptBlock(functionName, script)
Me.Attributes.Add("onclick", functionName + "('" + MyBase.ClientID + "','" + _DisabledText.ToString() + "')")
End Sub
End Class
End Namespace
Sen har jag lagt ut en knapp i formuläret.
När sidan laddas får jag "Unterminated string constant".
Om jag tar bort detta i koden och istället lägger javascriptet manuellt i html:en(inom <head>), funkar det perfekt.
Detta tar jag bort:
Dim script As String
script = "<script language=" & Chr(34) & "javascript" & Chr(34) & " type=" & Chr(34) & "text/javascript" & Chr(34) & ">" & vbCrLf
script &= "function " & functionName & " (btn,txt) {" & vbCrLf
script &= "document.getElementById(btn).disabled = true;" & vbCrLf
script &= "document.getElementById(btn).value = txt;" & vbCrLf
script &= "__doPostBack(document.getElementById(btn).getAttribute('name'),"");"
script &= "} " & vbCrLf
script &= "</script>"
Me.Page.RegisterClientScriptBlock(functionName, script)
Om jag tar View Source på dessa exemplen är enda skillnaden att på den som funkar hamnar javascriptet inom <head>, jag la ju det där manuellt...
När det skapas dynamiskt hamnar det nedanför <head>.
Javascriptet och anropen från knappen ser exakt likadant ut för övrigt.
Är det detta som är fel?
Hur får jag till det, i så fall, så att det hamnar inom <head>??
/Jocke
Sv:Egen knapp?
Sv: Egen knapp?
Tackar för hjälpen!
När jag skrev så här funkar det perfekt:
Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
MyBase.OnPreRender(e)
Dim script As String
script = "<script language=""javascript"" type=""text/javascript"">" & vbCrLf
script &= "function " & functionName & "(btn,txt) {" & vbCrLf
script &= "document.getElementById(btn).disabled = true;" & vbCrLf
script &= "document.getElementById(btn).value = txt;" & vbCrLf
script &= "__doPostBack(document.getElementById(btn).getAttribute('name'),'');"
script &= "} " & vbCrLf
script &= "</script>"
Me.Page.RegisterClientScriptBlock(functionName, script)
Me.Attributes.Add("onclick", functionName + "('" + MyBase.ClientID + "','" + _DisabledText.ToString() + "')")
End Sub
Man bugar o bockar!
/Jocke