Det känns inte som en bra lösningom man frågar mig. Så du får gärna förklara mer på vad du ska ha det till?
Confirmruta i dropdownlist
6 svar · 266 visningar · startad av NETwork
Ta bort autopostback från dropdownrutan och gör det själv i javascript om användaren klickar på OK
//.aspx
<asp:dropdownlist id="ddlTest" runat="server">
<asp:listitem text="Ja" />
<asp:listitem text="Nej" />
<asp:listitem text="Vet ej" />
</asp:dropdownlist>
//.cs
private void Page_Load(object sender, System.EventArgs e)
{
BindJavascript();
}
private void BindJavascript()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script language=\"javascript\">\r<!--\r");
sb.Append("function __doSpecialPostBack(eventTarget, eventArgument) {\r");
sb.Append("if(confirm(\"Är du säker?\")){\r");
sb.Append("var theform;\r");
sb.Append("if (window.navigator.appName.toLowerCase().indexOf(\"netscape\") > -1) {\r");
sb.Append("theform = document.forms[\"_ctl0\"];\r}");
sb.Append("else {theform = document._ctl0;}\r");
sb.Append("theform.__EVENTTARGET.value = eventTarget.split(\"$\").join(\":\");\r");
sb.Append("theform.__EVENTARGUMENT.value = eventArgument;\r");
sb.Append("theform.submit();\r");
sb.Append("}\r");
sb.Append("}\r");
sb.Append("// -->\r</script>");
ddlTest.Attributes.Add("onchange", "__doSpecialPostBack('ddlTest','')");
if(!this.IsClientScriptBlockRegistered("specialDropDownScript"))
{
this.RegisterClientScriptBlock("specialDropDownScript", sb.ToString());
this.RegisterHiddenField("__EVENTTARGET", "");
this.RegisterHiddenField("__EVENTARGUMENT", "");
}
}
private void ddlTest_SelectedIndexChanged(object sender, System.EventArgs e)
{
Response.Write(ddlTest.SelectedValue);
}
Tack, ska försöka sätta mig in i koden lite senare (en massa annat kom emellan) .. ser komplicerat ut... Problemet är också att den ligger i en repeater. Det är tom två dropdownlistor som bör ha den här funktionen på varje rad, vet inte om jag lyckats tyda din kod rätt men fungerar detta på flera dropdownlistor?
Det känns inte som en bra lösningom man frågar mig. Så du får gärna förklara mer på vad du ska ha det till?
Platsbrist! Jag har en lista med två dropdownlistor där den ena används för att flytta den aktuella raden (eller divisionen för att tala klarspråk), den andra för att slå samman med en annan division. Nu har en knapp kopplad till respektive dropdownlist med ett confirm-script på knappen, men om jag kan få en confirm-ruta att samarbeta med en autopostback så kan jag ta bort knapparna och jag får bort två knappar som dels tar en massa plats, dels gör att sidan bara ser krångligare ut.
Att en confirm behövs kan jag garantera då det ska användas av 50-åriga damer inom vården. De behöver confirmrutor på ALLT! :) Varför är det en dålig idé menar du?
Omgjord för en Repeater. Otestad, men det funkar säkert. :)
//.aspx
<asp:repeater id="repTest" runat="server">
<headertemplate>
<table>
</headertemplate>
<itemtemplate>
<tr>
<td><asp:dropdownlist id="ddlGrr1" runat="server"></td>
<td><asp:dropdownlist id="ddlGrr2" runat="server"></td>
</tr>
</itemtemplate>
<footertemplate>
</table>
</footertemplate>
</asp:repeater>
//.cs
private void Page_Load(object sender, System.EventArgs e)
{
BindJavascript();
}
private void BindJavascript()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script language=\"javascript\">\r<!--\r");
sb.Append("function __doSpecialPostBack(eventTarget, eventArgument) {\r");
sb.Append("if(confirm(\"Är du säker?\")){\r");
sb.Append("var theform;\r");
sb.Append("if (window.navigator.appName.toLowerCase().indexOf(\"netscape\") > -1) {\r");
sb.Append("theform = document.forms[\"_ctl0\"];\r}");
sb.Append("else {theform = document._ctl0;}\r");
sb.Append("theform.__EVENTTARGET.value = eventTarget.split(\"$\").join(\":\");\r");
sb.Append("theform.__EVENTARGUMENT.value = eventArgument;\r");
sb.Append("theform.submit();\r");
sb.Append("}\r");
sb.Append("}\r");
sb.Append("// -->\r</script>");
if(!this.IsClientScriptBlockRegistered("specialDropDownScript"))
{
this.RegisterClientScriptBlock("specialDropDownScript", sb.ToString());
this.RegisterHiddenField("__EVENTTARGET", "");
this.RegisterHiddenField("__EVENTARGUMENT", "");
}
}
private void repTest_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DropDownList ddl1 = (DropDownList)e.Item.FindControl("ddlGrr1");
DropDownList ddl2 = (DropDownList)e.Item.FindControl("ddlGrr2");
//Code to fill dropdowns with data
ddl1.Attributes.Add("onchange", "__doSpecialPostBack('" + ddl1.ID + "', '')");
ddl2.Attributes.Add("onchange", "__doSpecialPostBack('" + ddl2.ID + "', '')");
}
}
Anledningen jag inte tycker att det hela är en bra ide är att du, som jag uppfattar det, skickar/ändrar data när man har ändrat i listboxen. Vilket enligt min mening inte är så bra användar mässigt. Då är det bättre att tex dela upp det i flera steg och sedan har en knapp som avslutar det hela.
Men jag kan fått det hela lite om bakfoten. Men jag tycker inte att något ska hända när man väljer i en dropdown mer än att kanske en till dropdown eller fält ska dyka upp.
Hoppas du förstår vad jag menar.
