Avatar billede mosquito Nybegynder
18. april 2006 - 17:43 Der er 11 kommentarer og
1 løsning

confirm clientscript virker ikke

Jeg har et Gridview i en usercontrol, hvor jeg tilføjer en ButtonField dynamisk, hvis brugeren skal kunne slette en række.
På klientsiden vil jeg gerne advare brugeren at denne er ved at slette en række, inden den slettes.

Men uanset hvad brugeren herefter svarer, slettes rækken ikke. Der sker et postback hvis brugeren accepterer, men intet slettes.


110  protected void gridView_RowCreated(object sender , GridViewRowEventArgs e)
111  {
112    // set delete button index
113    int buttonIndex = 9;
114    if (e.Row.RowType == DataControlRowType.DataRow)
115    {
116      ImageButton deleteButton = (ImageButton) e.Row.Cells[buttonIndex].Controls[0];
117      deleteButton.OnClientClick = "return DeleteRow()";
118    }
119  }

hvis jeg udkommenterer linie 117 virker alt som det skal, men brugeren bliver ikke advaret inden rækken slettes.

Jeg bruger .Net framework 2.0, hvis det gør nogen forskel.

mit script kan vist ikke gøres mere simpel:

function DeleteRow()
{
  return confirm('Er du sikker?')
}

Hvad gør jeg galt??
Avatar billede snepnet Nybegynder
18. april 2006 - 18:02 #1
prøv at se om det her går godt:
deleteButton.OnClientClick = "DeleteRow()";
function DeleteRow()
{
  event.returnValue = confirm('Er du sikker?')
}
mvh
Avatar billede mosquito Nybegynder
19. april 2006 - 08:11 #2
snepnet--> prøvet, men jeg opnår et resultat med omvendt fortegn. Rækken slettes, uanset valget i confirm popup'en.
Avatar billede snepnet Nybegynder
20. april 2006 - 11:41 #3
prøv uden return her:
deleteButton.OnClientClick = "DeleteRow()";
der kan være lidt browsertingeltangel... hvilken browser bruger du?
mvh
Avatar billede mosquito Nybegynder
20. april 2006 - 11:49 #4
snepnet--> er også prøvet, rækken slettes ikke uanset valget i confirm popup'en. Jeg har prøvet både IE 7.0 og IE 6.0 med samme resultat.

Jeg har lavet et testsite, hvor jeg opretter et gridview med en ButtonField og derudover en almindelig Button, som begge anvender scriptet. Button virker fint og reagerer forventet på svaret i popup'en, men ButtonField gør ikke.
Avatar billede mosquito Nybegynder
20. april 2006 - 11:51 #5
snepnet--> det virker som om at confirm ikke kender den event som ButtonField kaster.
Avatar billede snepnet Nybegynder
20. april 2006 - 12:25 #6
Button og ButtonField har ikke rigtig med hinanden at gøre.
det nemmeste er næsten hvis du bare laver en confirmbutton én gang for alle (du kan sådan set også lavet et ConfirmButtonField hvis du skulle have lyst til det).

læg sådan en her i app_code:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace SpecialControls
{
    public class ConfirmButton : Button
    {
        private string _confirmText = "Sikker?";

        public string ConfirmText
        {
            get { return _confirmText; }
            set { _confirmText = value; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "return confirm('" + ConfirmText + "')");
            base.Render(writer);
        }
    }
}

så kan du bruge den på siden sådan her:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ControlTest.aspx.cs" Inherits="ControlTest" %>
<%@ Register Namespace="SpecialControls" TagPrefix="spc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <spc:ConfirmButton ID="btnConfirm" runat="server" Text="Slet" ConfirmText="Er du sikker på at du vil slette?" />
    </div>
    </form>
</body>
</html>


eller programmatisk:
ConfirmButton btn = new ConfirmButton();
form1.Controls.Add(btn);

mvh
Avatar billede mosquito Nybegynder
20. april 2006 - 15:22 #7
snepnet> Det er selvfølgelig smart at samle funktionaliteten i en custom class, men det løser ikke mit problem. Hvordan tilføjer jeg denne confirmbutton til mit GridView? Jeg havde håbet på at jeg kunne arve fra ButtonField, men så har jeg ikke Render til rådighed og kan ikke tilføje 'onclick' til controllen.
Avatar billede snepnet Nybegynder
20. april 2006 - 17:28 #8
du kan jo bare sætte en templatekolonne ind istedet for en buttoncolumn - og så klaske knappen derind.
og du kan også specialisere en buttoncolumn, og sætte din egen knap ind.... du kan få en idé til det her:

namespace SpecialControls
{
    public class ConfirmButton : Button
    {
        private string _confirmText = "Sikker?";

        public string ConfirmText
        {
            get { return _confirmText; }
            set { _confirmText = value; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "return confirm('" + ConfirmText + "')");
            base.Render(writer);
        }
    }

    public class ConfirmButtonField : ButtonField
    {
        public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
        {
            base.InitializeCell(cell, cellType, rowState, rowIndex);
            cell.Controls.Add(new ConfirmButton());
        }
    }
}

mvh
Avatar billede mosquito Nybegynder
24. april 2006 - 16:01 #9
snepnet> jeg kan ikke få det til at gøre nogen forskel. Din løsning giver fint nok et postback, men den fanger ikke eventen. Jeg arbejder med en løsning hvor jeg bruger en TemplateField, ItemPlate og ImageButton. Jeg har fået det til at virke hvis jeg statisk indsætter templatefield i min html:

<asp:TemplateField HeaderText="Select" >
<ItemTemplate>
<asp:ImageButton ID="lnkBtn" ImageUrl="~/images/delete16x16.gif" CommandArgument='<%# Eval("rtID") %>' CommandName="Delete" runat="server">
</asp:ImageButton>
</ItemTemplate>
</asp:TemplateField>

Desværre har jeg endnu ikke fået det til at virke dynamisk, men jeg har ikke givet op... endnu...
Avatar billede snepnet Nybegynder
24. april 2006 - 22:42 #10
mmm... nu ved jeg ikke helt hvad det er du gør, men umiddelbart burde det godt kunne lade sig gøre - f.eks. sådan her:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Data> liste = new List<Data>();
        liste.Add(new Data("blah1"));
        liste.Add(new Data("blah2"));
        liste.Add(new Data("blah3"));
        GridView grid = new GridView();
        grid.RowCommand += new GridViewCommandEventHandler(grid_RowCommand);
        grid.AutoGenerateColumns = false;
        BoundField bf = new BoundField();
        bf.HeaderText = "blah";
        bf.DataField = "Name";
        grid.Columns.Add(bf);
        grid.Columns.Add(new ConfirmButtonField());
        grid.DataSource = liste;
        form1.Controls.Add(grid);
        grid.DataBind();
    }

    void grid_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        Response.Write(e.CommandSource.ToString());
    }
}

public class Data
{
    private string m_name;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public Data(string name)
    {
        m_name = name;
    }   
}


altså - baseret på de samme klasser fra tidligere:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace SpecialControls
{
    public class ConfirmButton : Button
    {
        private string _confirmText = "Sikker?";

        public string ConfirmText
        {
            get { return _confirmText; }
            set { _confirmText = value; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "return confirm('" + ConfirmText + "')");
            base.Render(writer);
        }
    }

    public class ConfirmButtonField : ButtonField
    {
        public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
        {
            base.InitializeCell(cell, cellType, rowState, rowIndex);
            cell.Controls.Add(new ConfirmButton());
        }
    }
}

mvh
Avatar billede mosquito Nybegynder
06. maj 2006 - 17:50 #11
Jeg valgte at tilføje knapperne statisk og slap derfor af med arv. Herefter valgte jeg at gøre kolonnen 'delete' invisible, hvis brugeren ikke skal have denne mulighed. I rowDataBound tilføjer jeg scriptet, men er nødt til at databinde i både page_load og prerender for at få det til at virke.

snepnet> smid et svar, point er dine for indsatsen. Dine forslag var oplysende.
Avatar billede snepnet Nybegynder
07. maj 2006 - 20:46 #12
Et svar kommer her.
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester