Ich suche eine Möglichkeit, mit einem CommandField eine
Löschbestätigung mit Javascript aufzurufen. Ich hab schon einige
Beispiele gefunden, leider konnte ich noch keines bei meinem Beispiel
erfolgreich anwenden. Hier einmal das CommandField
<asp:CommandField ShowDeleteButton="True" ItemStyle-Width="50"
ItemStyle-VerticalAlign="Top" DeleteImageUrl="~/
Images/loeschen.png"
EditImageUrl="~/Images/bearbeiten.png"
UpdateImageUrl="~/Images/speichern.png" ButtonType="Image">
</asp:CommandField>
Im RowDeleting-Ereignis des GridViews möchte ich nun diese
DeleteConfirm-Nachricht einbauen. Das Ereignis enthält folgenden Code:
protected void GridNews_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
BindGrid();
DataSet dataset = new DataSet();
dataset = (DataSet)GridNews.DataSource;
dataset.Tables[0].Rows[GridNews.Rows[e.RowIndex].DataItemIndex].Delete();
dataset.WriteXml(Request.PhysicalApplicationPath + filename);
BindGrid();
}
Die Nachricht soll natürlich vor der Delete()-Methode aufgerufen
werden. Ich habe zwar dieses (http://forums.asp.net/p/
972930/1358433.aspx) Beispiel gefunden, doch ich möchte diese
Nachricht ja im RowDeleting- und nicht im RowDataBound ausführen. Und
als Parameter GridViewRowEventArgs eingeben geht natürlich auch nicht
einfach so.
Hoffe Ihr könnt mir helfen. Besten Dank schon mal!
Grüsse
Paul
"Paul Aeschlimann" schrieb:
> Im RowDeleting-Ereignis des GridViews möchte ich nun diese
> DeleteConfirm-Nachricht einbauen.
warum dort? Ist dort eigentlich schon zu spät bzw. unnötig.
Du willst die Rückfrage clientseitig per JavaScript stellen.
Dafür solltest Du im RowDataBound Event den entsprechenden
JavaScript Code ausgeben.
> Die Nachricht soll natürlich vor der Delete()-Methode aufgerufen
> werden.
Dann müsstest Du aber einen weiteren Roundtrip zum Server durchführen
und alles nochmal durchlaufen. In einem Rutsch kann das nicht gehen,
weil das RowDeleting Ereignis serverseitig abläuft, Du dann erstmal
den JavaScript zusammenstellen, zum Client senden und beim nächsten
Aufruf die eigentliche Löschung durchführen müsstest.
> Ich habe zwar dieses (http://forums.asp.net/p/
> 972930/1358433.aspx) Beispiel gefunden, doch ich möchte diese
> Nachricht ja im RowDeleting- und nicht im RowDataBound ausführen.
Was aber falsch wäre. Nimm das Beispiel, das passt schon so. Im
RowDataBound Ereignis wird ja lediglich der Code zusammengestellt,
der dann im Browser dafür sorgt, dass bei einem Klick auf "Löschen"
die entsprechende Abfrage kommt und nur, wenn dort Ok geklickt wird,
wird der Postback zum Server ausgelöst.
--
Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
> > Die Nachricht soll natürlich vor der Delete()-Methode aufgerufen
> > werden.
>
> Dann müsstest Du aber einen weiteren Roundtrip zum Server durchführen
> und alles nochmal durchlaufen. In einem Rutsch kann das nicht gehen,
> weil das RowDeleting Ereignis serverseitig abläuft, Du dann erstmal
> den JavaScript zusammenstellen, zum Client senden und beim nächsten
> Aufruf die eigentliche Löschung durchführen müsstest.
Ok, hab ich nicht gewusst, dass das in einem Schritt geht.
> > Ich habe zwar dieses (http://forums.asp.net/p/
> > 972930/1358433.aspx) Beispiel gefunden, doch ich möchte diese
> > Nachricht ja im RowDeleting- und nicht im RowDataBound ausführen.
>
> Was aber falsch wäre. Nimm das Beispiel, das passt schon so. Im
> RowDataBound Ereignis wird ja lediglich der Code zusammengestellt,
> der dann im Browser dafür sorgt, dass bei einem Klick auf "Löschen"
> die entsprechende Abfrage kommt und nur, wenn dort Ok geklickt wird,
> wird der Postback zum Server ausgelöst.
Jetzt sind noch einige Fehler in meinem Code und zwar:
1| protected void GridNews_RowDataBound(object sender,
GridViewRowEventArgs e)
2| {
3| CommandField DeleteNewsentryButton =
(CommandField)e.Row.Cells[0].Controls[0];
4|
5| if (e.Row.RowType == DataControlRowType.DataRow)
6| DeleteNewsentryButton.OnClientClick = "return
confirm('Are you sure you want to delete this record?');";
7| }
In Zeile 3 bekomme ich den "Cannot convert type
'System.Web.UI.Control' to 'System.Web.UI.WebControls.CommandField'"-
Fehler. Ich hab's vorhin mit ImageButton anstelle von CommandField
versucht, da ich den ButtonType vom CommandField auf Image gsetzt
habe. Damit bekomme ich dann "Unable to cast object of type
'System.Web.UI.WebControls.PagerTable' to type
'System.Web.UI.WebControls.ImageButton'". Ich begreife den Fehler
nicht...?
Grüsse Paul
"Paul Aeschlimann" schrieb:
> 3| CommandField DeleteNewsentryButton =
> (CommandField)e.Row.Cells[0].Controls[0];
>
> In Zeile 3 bekomme ich den "Cannot convert type
> 'System.Web.UI.Control' to 'System.Web.UI.WebControls.CommandField'"-
Das CommandField ist die Spalte im GridView. Der Button ist ein Control
in dieser Spalte. Du kannst das nicht in CommandField umwandeln. Zeig
doch mal die Deklaration.
Allerdings würde ich persönlich ein TemplateField nehmen. Dort kann man
rumhantieren wie man will :)
> habe. Damit bekomme ich dann "Unable to cast object of type
> 'System.Web.UI.WebControls.PagerTable' to type
> 'System.Web.UI.WebControls.ImageButton'". Ich begreife den Fehler
> nicht...?
Ohne den relevanten Code (Deklaration des GridView bzw. der entsprechenden
Fields) wird das auch nix. Poste den bitte mal.
> > 3| CommandField DeleteNewsentryButton =
> > (CommandField)e.Row.Cells[0].Controls[0];
>
> > In Zeile 3 bekomme ich den "Cannot convert type
> > 'System.Web.UI.Control' to 'System.Web.UI.WebControls.CommandField'"-
>
> Das CommandField ist die Spalte im GridView. Der Button ist ein Control
> in dieser Spalte. Du kannst das nicht in CommandField umwandeln. Zeig
> doch mal die Deklaration.
Also, die Deklaration sieht so aus:
<asp:CommandField ShowDeleteButton="True" ItemStyle-
Width="16"
ItemStyle-VerticalAlign="Top" DeleteImageUrl="~/
Images/loeschen.png"
EditImageUrl="~/Images/bearbeiten.png"
UpdateImageUrl="~/Images/speichern.png"
ButtonType="Image"
CancelImageUrl="~/Images/verwerfen.png"
CancelText="Verwerfen"
DeleteText="Löschen" EditText="Bearbeiten"
UpdateText="Speichern">
<ItemStyle VerticalAlign="Top" Width="16px"></
ItemStyle>
</asp:CommandField>
> Allerdings würde ich persönlich ein TemplateField nehmen. Dort kann man
> rumhantieren wie man will :)
Hmm, müsste ich das dann im ItemTemplate machen, welches ja im
TemplateField ist? So in der Art:
<asp:GridView ... >
<Columns>
<asp:TemplateField ... >
<EditItemTemplate>
<asp:TextBox ... />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ... />
<asp:ImageButton ... /> <-- so etwa?
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
> > habe. Damit bekomme ich dann "Unable to cast object of type
> > 'System.Web.UI.WebControls.PagerTable' to type
> > 'System.Web.UI.WebControls.ImageButton'". Ich begreife den Fehler
> > nicht...?
>
> Ohne den relevanten Code (Deklaration des GridView bzw. der entsprechenden
> Fields) wird das auch nix. Poste den bitte mal.
<asp:GridView AutoGenerateColumns="False" ID="GridNews"
runat="server"
onpageindexchanging="GridNews_PageIndexChanging"
onrowdeleting="GridNews_RowDeleting"
onrowediting="GridNews_RowEditing"
onrowupdating="GridNews_RowUpdating"
onrowcancelingedit="GridNews_RowCancelingEdit"
Width="680px"
GridLines="Horizontal" PageSize="6" PagerSettings-
Position="TopAndBottom"
EmptyDataText="---" AllowPaging="True"
onrowdatabound="GridNews_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="News"
InsertVisible="False">
<EditItemTemplate>
<asp:TextBox ID="Label1" runat="server" Text='<
%# Bind("Titel") %>' Width="480"></asp:TextBox>
<asp:TextBox ID="Label2" runat="server" Text='<
%# Bind("Datum") %>'></asp:TextBox>
<asp:TextBox ID="Label3" runat="server" Text='<
%# Bind("Text") %>' Width="480" TextMode="MultiLine" Height="200"></
asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<
%# Bind("Titel") %>'></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text='<
%# Bind("Datum") %>'></asp:Label>
<br />
<asp:Label ID="Label3" runat="server" Text='<
%# Bind("Text") %>' Height="100"></asp:Label>
<br />
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# Bind("Bild") %>' CssClass="image"
GenerateEmptyAlternateText="True" />
</ItemTemplate>
<AlternatingItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<
%# Bind("Titel") %>'></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text='<
%# Bind("Datum") %>'></asp:Label>
<br />
<asp:Label ID="Label3" runat="server" Text='<
%# Bind("Text") %>' Height="100"></asp:Label>
<br />
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# Bind("Bild") %>' CssClass="image"
GenerateEmptyAlternateText="True" />
<br />
</AlternatingItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" ItemStyle-
Width="50"
ItemStyle-VerticalAlign="Top" DeleteImageUrl="~/
Images/loeschen.png"
EditImageUrl="~/Images/bearbeiten.png"
UpdateImageUrl="~/Images/speichern.png"
ButtonType="Image"
CancelImageUrl="~/Images/verwerfen.png"
CancelText="Verwerfen"
DeleteText="Löschen" EditText="Bearbeiten"
UpdateText="Speichern">
<ItemStyle VerticalAlign="Top" Width="16px"></
ItemStyle>
</asp:CommandField>
<asp:CommandField ShowDeleteButton="True" ItemStyle-
Width="16"
ItemStyle-VerticalAlign="Top" DeleteImageUrl="~/
Images/loeschen.png"
EditImageUrl="~/Images/bearbeiten.png"
UpdateImageUrl="~/Images/speichern.png"
ButtonType="Image"
CancelImageUrl="~/Images/verwerfen.png"
CancelText="Verwerfen"
DeleteText="Löschen" EditText="Bearbeiten"
UpdateText="Speichern">
<ItemStyle VerticalAlign="Top" Width="16px"></
ItemStyle>
</asp:CommandField>
</Columns>
<PagerSettings Position="TopAndBottom"></PagerSettings>
<RowStyle Width="400" />
<AlternatingRowStyle BackColor="#99CCFF" Width="400" />
</asp:GridView>
So siehts derzeit aus.
Gruss Paul