webForumDet fria alternativet

checkbox - javascript confirm?

8 svar · 465 visningar · startad av NETwork

NETworkMedlem sedan juni 20011 679 inlägg
#1

Fler problem! :) Har en datagrid med en kolumn checkboxar med autopostback = true. Med "prerender" kan man ju som Gladh skrev här tidigare få upp ett javascript (confirm) när du klickar på en vanlig button. Är det möjligt att göra det på samma sätt med ett gäng checkboxar?

http://eforum.idg.se/viewmsg.asp?entriesid=443455

renholmMedlem sedan apr. 20012 048 inlägg
#2

Ja det borde det vara då jag tror att Checkboxar kan hantera onclick-javascripts.

NETworkMedlem sedan juni 20011 679 inlägg
#3

Lyckades inte fådet att fungera, problemet är kanske att onclick redan används av autopostback (gissning)?

Vi gjorde en annan lösning i flera steg istället. Skapade en osynlig textbox och en button (lyckades inte sätta ett value på en button därav tvungen att använda en textbox också). När man trycker på checkboxen så slänger man upp en confirm-ruta och beroende på vad man svarar fyller man textboxen med checkboxens true eller false samt i mitt fall SelectedNewsID... eller inget alls om man klickar på cancel. Sedan kör man onclick direkt på min button som i sin tur kör en ny funktion där jag använder textboxen för att kolla huruvida checkboxen skulle tryckts på eller inte.

<itemtemplate>
  <asp:checkbox OnPreRender="Render" 
Enabled='<%# IsPublisher() %>' Checked='<%# DataBinder.Eval(Container, "DataItem.Enabled") %>' 
AutoPostBack="True" OnCheckedChanged="CheckBox1_CheckedChanged"
Runat="server" ID="Checkbox1" NAME="Checkbox1"></asp:checkbox>
</itemtemplate>
...
<asp:TextBox id="HiddenTB" runat="server"></asp:TextBox>
<asp:Button id="ConfirmB" runat="server" Text="a"></asp:Button>

//när jag klickar på checkboxen
int SelectedNewsID = (int)PagesDG.DataKeys[((DataGridItem)((CheckBox)sender).Parent.Parent).ItemIndex];

Page.RegisterStartupScript("","<script>if(confirm('Är du säker på att du vill publicera detta dokument?')
{'document.getElementById('HiddenTB').value = '"+SelectedNewsID+","+((CheckBox)sender).Checked+"';
document.getElementById('ConfirmB').click()}
else{document.getElementById('HiddenTB').value = '';
document.getElementById('ConfirmB').click()}</script>");

Sist då den vanliga funktionen som körs av min button som startas från javascriptet där jag kör den egentliga koden som bockar av (eller inte) checkboxen beroende på vad jag har i min textbox. Omständigt är det och det kräver två (!) postbacks tyvärr, men det funkar. :)

renholmMedlem sedan apr. 20012 048 inlägg
#4

hum, jag använder inte Gladhs variant utan denna som funkar fint med en datagrid men borde även fungera med en repeater.

private void dgNodes_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
	if (e.Item.ItemType == ListItemType.Item)
	{
		ImageButton delete = (ImageButton)e.Item.FindControl("btnDelete");
		delete.Attributes.Add("onclick","return confirm('Delete node?');");
	}
}
DinoMedlem sedan sep. 20011 918 inlägg
#5

Han ville väl ha själva confirmen på checkboxen innan den gör en postback. Om man då med din kod byter ut ImageButton mot CheckBox så dyker ett lite dumt problem upp. Attributet lägger sig inte som man tänker i "<input type="checkbox" onchange="return confirm('Delete node?');"...", utan istället i den span som omger inputen och resultaten blir inte så lyckat.
Tycker ändå att det måste finnas något smidigare än den lösning han har nu.

renholmMedlem sedan apr. 20012 048 inlägg
#6

Har inte haft tid att fördjupa mig mer men fungerar inte det med att ha onclick på span då?

<span onclick="return confirm('Checka?');"><input type="checkbox"> Bla</span>

Följande fungerar men problemet är väl som Dino säger den postback som görs.

red, infogade lite mer information

renholmMedlem sedan apr. 20012 048 inlägg
#7

Testade lite och följande fungerar för mig med den ovanstående koden i ItemDataBound. Fast har problem med att postback inte körs vid ett OK i confirm. Detta beror på att om man lägger return innan postback anropet kommer den ignorera postbackkoden.

Följande kod

<asp:checkbox ID="cbWindows" Runat="server" AutoPostBack="true" Text="Ingår"></asp:checkbox>

Ger denna html

<input id="_ctl1_dgSpec__ctl5_cbWindows" type="checkbox" name="_ctl1:dgSpec:_ctl5:cbWindows" checked="checked" onclick="return confirm('Checka?');__doPostBack('_ctl1$dgSpec$_ctl5$cbWindows','')" language="javascript" /><label for="_ctl1_dgSpec__ctl5_cbWindows">Ingår</label>
DinoMedlem sedan sep. 20011 918 inlägg
#8

Ok, det här funkar fullt ut (för mig iaf :)).

<asp:checkbox id="cbTest" oncheckedchanged="cbTest_oncheckedchanged" autopostback="True" runat="server"/>
private void repTest_ItemCreated(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
   {
      ((CheckBox)e.Item.FindControl("cbTest")).Attributes.Add("onclick","if(!confirm('Är du säker...?')){return false};");
   }
}

public void cbTest_oncheckedchanged(object sender, System.EventArgs e)
{
   CheckBox cb = (CheckBox)sender;
   Response.Write(cb.UniqueID);
}
NETworkMedlem sedan juni 20011 679 inlägg
#9

Tackar, det var ju betydligt smidigare! :)

Genererad på 373 ms · cache AV · v20260730165559-full.f96bc7eb