Ich habe eine Dropdownliste, die mit 3 Einträgen gefüllt ist.
Wenn ich die Liste anklicke und einen der Einträge auswähle, soll eine Sicherheitsabfrage kommen, ob ich das auch wirklich auswählen will.
Bei normalen Buttons kann ich das ja über dieses Javascript machen:
JavaScript.confirm(btnÄndern, "Wirklich ändern?");
wenn ich das allerdings mit der DDL versuche,kommt wenn ich darauf klicke zwar die Abfrage, aber ich kann dann keinen Eintrag mehr auswählen, da sofort wenn ich den DDLPfeil drücke, die Abfrage aufgeht.
Gibt es ne Möglichkeit, dass die Abfrage erst kommt wenn der Eintrag ausgewählt wurde?
Oder dass ich nach der Abfrage auswählen kann. Die Reihenfolge ist also prinzipiell egal!
Der Event, den Du suchst heißt "onChange".
http://de.selfhtml.org/javascript/sprache/eventhandler.htm#onchange
Danke soweit schonmal
Jetzt kann ich einen Eintrag auswählen, mein Confirm Popup kommt auch, nur leider hat es keine Auswirkung, ob ich auf ja oder nein gehe, der ausgewählte Eintrag wird doch ausgeführt (Auf der ddl ist ein selectedIndexChanged!)
Der Code sieht für die Abfrage sieht jetzt so aus:
ddlAendern.Attributes.Add("onchange", "confirm('ändern?');");
änder mal in
ddlAendern.Attributes.Add("onchange", "return confirm('ändern?');");
jetzt kann ich munter ändern und es mir bestätigen lassen, nur wird so mein selectedIndexChanged nun ignoriert.
Ja, ist eigentlich auch logisch - da das "Server-Event" natürlich das gleiche Clientevent benutzt. Schau mal in den generierten Code, wahrscheinlich steht da jetzt 2x "onchange=" drin.
Was mir auf die schnelle einfällt:
In OnPreRender den Inhalt auslesen, davor deinen JS-Code setzen, Attribut entfernen und neu hinzufügen. ABer keine Garantie, dass das klappt.
Alternativ halt einen Button neben die Selectbox setzen ... das funktioniert dann auch mit ausgeschaltetem JS.
Original von Waschbecken
Ja, ist eigentlich auch logisch - da das "Server-Event" natürlich das gleiche Clientevent benutzt. Schau mal in den generierten Code, wahrscheinlich steht da jetzt 2x "onchange=" drin.
Ist eigentlich kein Problem. Das hinzugefügte Attribut wird einfach mit dem vorhandenen zusammengeführt.
@Locust:
Mit PostBack musst Du die Abfrage ein wenig anders gestalten:
ddl.Attributes.Add("onchange", "if(!confirm('sicher?'))return false;");
Original von .Kai
Original von Waschbecken
Ja, ist eigentlich auch logisch - da das "Server-Event" natürlich das gleiche Clientevent benutzt. Schau mal in den generierten Code, wahrscheinlich steht da jetzt 2x "onchange=" drin.Ist eigentlich kein Problem. Das hinzugefügte Attribut wird einfach mit dem vorhandenen zusammengeführt.
Ist das so? Wenn ja wäre es praktisch ... Locust, poste mal den generierten HTML-Code. Also den relevanten Teil.
Original von .Kai
@Locust:
Mit PostBack musst Du die Abfrage ein wenig anders gestalten:ddl.Attributes.Add("onchange", "if(!confirm('sicher?'))return false;");
ist genau das gleiche wie return confirm('sicher') 😁
hmm, die idee mit dem Button hatte ich auch schon - wird es jetzt wohl auch werden, auch wenn es nicht gerade die eleganteste Lösung ist.
Trotzdem Danke für die Hilfe!
edit - oh, da kamen ja noch neue Antworten, gleich mal die Testen 😉
Original von Waschbecken
Ist das so? Wenn ja wäre es praktisch ... Locust, poste mal den generierten HTML-Code. Also den relevanten Teil.
ja, hab es grade ausprobiert.
ddl.Attributes.Add("onchange", "if(!confirm('sicher?'))return false;");
ist genau das gleiche wie return confirm('sicher') 😄
Nein, ist es nicht 😁
Wenn confirm == true ist, wird kein return zurückgegeben und somit auch die JavaScript Verarbeitung (sprich das PostBack) nicht abgebrochen.
Super! Das ganze funktioniert!
Jetzt fällt mir nur noch ne Schönheitskorrektur ein:
Kann man es bewerkstelligen, dass beim Abbruch wieder auf den ursprünglichen Listeneintrag gesprungen wird?
Ansonsten wirklich schonmal 1000 Dank! tolles Forum!
Klar, Du musst bei OnClick einfach den momentanen Index in einer Variablen auf der Seite speichern und dann wieder abrufen. Ist ein wenig aufwendiger, funktioniert aber.
Original von .Kai
Nein, ist es nicht 😁
Wenn confirm == true ist, wird kein return zurückgegeben und somit auch die JavaScript Verarbeitung (sprich das PostBack) nicht abgebrochen.
Right.
Original von Locust
Super! Das ganze funktioniert!
Jetzt fällt mir nur noch ne Schönheitskorrektur ein:
Kann man es bewerkstelligen, dass beim Abbruch wieder auf den ursprünglichen Listeneintrag gesprungen wird?
Speicher dir beim Aufruf der Seite den SelectedIndex in deine JavaScript-Variable
(Dirty/Pseudocode:
<script type="text/javascript">
var currentIndex = <%= MyDropDownList.SelectedValue %>;
</script>
Und für den Abbruch bei Confirm=false erstellst du dir noch ne JS-Funktion:
<script type="text/javascript">
function AbortSelection()
{
document.getElementById('<%= MyDropDownList.ClientID %>').selectedValue = currentIndex
}
</script>
So ungefähr.
Die Lösung in deinem Blog funktioniert aber nur unter .Net 2.0 und höher oder?
In .NET 1.1 gibts System.Web.UI.WebControls.WebParts leider noch nicht...
Nein, den Code könntest Du so auch in 1.1 verwenden. Lediglich die Zeile
ClientScript.RegisterStartupScript(this.GetType(), "ddlSelectedIndex", script, true);
muss geändert werden. Wenn Du möchtest, kann ich das Projekt heute Abend gerne auch noch mal für 1.1 erstellen.
Mist, hab dich glatt vergessen. Ich schau mal was ich heute Abend machen kann....
Den Download findet man ganz unten im Beitrag:
http://blog.veloursnebel.de/PermaLink,guid,fc124187-fabc-4262-b948-c67f26ab4ae6.aspx