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?
checkbox - javascript confirm?
8 svar · 465 visningar · startad av NETwork
Ja det borde det vara då jag tror att Checkboxar kan hantera onclick-javascripts.
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. :)
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?');");
}
}
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.
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
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>
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);
}
Tackar, det var ju betydligt smidigare! :)