Autor |
Beitrag |
gage
Beiträge: 28
|
Verfasst: Do 03.12.09 11:53
Hallo,
ich habe eine Frage zum GridView.RowDeleting-Ereignis. Ich habe mir auch schon die Hilfe angesehen.
msdn.microsoft.com/d...deleting(VS.80).aspx
ich möchte mit dem GridView.RowDeleting-Ereignis eine Meldung ausgeben ob der Ausgewälte Datensatz wirklich gelöscht werden soll. Wenn ich beim Gridview auf löschen drücke ist der Datensatz ohne eine Abfrage weg.
Meine Frage ist welche if-Bedingung kann ich verwenden?
den Code unten habe ich versucht anzupassen an das Beispiel:
< Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| asp:GridView ID="GridView1" runat="server" AllowPaging="True" autogeneratecolumns="true" autogeneratedeletebutton="true" onrowdeleting="GridView1_RowDeleting" AllowSorting="True" CellPadding="4" DataKeyNames="Id" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" Width="679px"> <RowStyle BackColor="#EFF3FB" /> |
hoffentlich hat jemand eine Idee!
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 03.12.09 12:10
Mit Postback? Wäre das als Javascript nicht um einiges sinnvoller?
Ich weiß leider nicht, wie man JS am besten an Server-Controls bindet, mit Webforms habe ich nichts am Hut.
_________________ >λ=
|
|
gage
Beiträge: 28
|
Verfasst: Do 03.12.09 12:31
ich habe es gerade mit diesem Code probiert:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| void CustomersGridView_RowDeleting(Object sender, GridViewDeleteEventArgs e) { if (GridView1.SelectedIndex == GridView1.EditIndex) { e.Cancel = true; Message.Text = " Wollen Sie wirklich löschen?"; } } |
Jetzt geht es schon mal und eine meldung wird ausgegeben:
Quelltext 1: 2: 3:
| <asp:label id="Message" forecolor="Red" runat="server"/> |
aber davon ist der datensatz dann noch nicht gelöscht. hat da jemand eine idee?
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 03.12.09 13:36
e.Cancel ist der richtige Weg, aber du musst ihn an der richtigen Stelle einbinden: Durch e.RowIndex erfährst du, um welche Zeile es geht. Dann kommt die Abfrage mit entsprechendem Hinweis. Die Abfrage liefert eine Antwort für "löschen": true oder false. Diese Antwort musst du nach e.Cancel übernehmen (aber dabei musst du die Bedeutung dieses Cancel beachten, denn das bricht den aktuellen Vorgang des Löschens ab).
Gruß Jürgen
|
|
gage
Beiträge: 28
|
Verfasst: Do 03.12.09 16:30
jetzt sieht es so aus und es kommt ein Fenster (Wollen Sie Wircklich löschen?)
aber wenn ich dann ok drücke dann wird nicht gelöscht.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| void GridView1_RowDeleting(Object sender, GridViewDeleteEventArgs e) { if (GridView1.SelectedIndex == GridView1.EditIndex) { e.Cancel = true; WebControl aBtn = (WebControl)GridView1.Controls[GridView1.TabIndex]; aBtn.Attributes.Add("onclick", "return confirm ('Wollen Sie wirklich löschen?')"); } } |
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 03.12.09 18:08
Du hast meine wichtigsten Hinweise ignoriert, insb.:
JüTho hat folgendes geschrieben : | Diese Antwort musst du nach e.Cancel übernehmen |
Bei deiner jetzigen Lösung wird e.Cancel fest und unverrückbar auf true gesetzt; das bedeutet, das Löschen wird auf jeden Fall abgebrochen. Du musst aber die Antwort für deine Frage "wirklich löschen" übernehmen: ja => e.Cancel = false; nein => e.Cancel = true.
Jürgen
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 03.12.09 22:02
@gage: Der JS-Code sieht doch gar nicht schlecht aus, aber er muss natürlich vor dem Button-Click schon existieren.
@Jürgen: Innerhalb des Eventhandlers kannst du nicht mit dem User interagieren, dazu wäre ein weiterer Postback notwendig.
_________________ >λ=
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 04.12.09 10:44
Kha hat folgendes geschrieben : | @Jürgen: Innerhalb des Eventhandlers kannst du nicht mit dem User interagieren, dazu wäre ein weiterer Postback notwendig. |
Danke für diesen Hinweis.
Ich weiß ja, dass ich zu ASP.NET überhaupt nichts weiß (genauer: weniger als nichts). Normalerweise halte ich mich deshalb auch völlig heraus. Nur die Sachlage mit e.Cancel schien mir so klar zu sein, dass ich mich über meine Bedenken hinweggesetzt habe.
Gruß Jürgen
|
|
gage
Beiträge: 28
|
Verfasst: Fr 04.12.09 11:01
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| void GridView1_RowDeleting(Object sender, GridViewDeleteEventArgs e) { if (GridView1.SelectedIndex == GridView1.EditIndex) { e.Cancel = true; GridView1.SelectedIndex++; WebControl aBtn = (WebControl)GridView1.Controls[GridView1.SelectedIndex]; aBtn.Attributes.Add("onclick", "return confirm ('Wollen Sie wirklich löschen?')"); } } |
Mein Code Funktioniert so. Ich weiß zwar nicht ob er auch richtig ist und sinvoll. Gerade die Zeile wo ich SelectedIndex++ sage da bin ich am zweifeln ob das alles so richtig ist.
dann muss ich an einer Stelle ein neues Laden der Seite machen
C#-Quelltext 1:
| Load += new EventHandler(Page_Load); |
an welcher Stelle muss ich die Seite neu laden lassen?
Ich kann das ganze mit der Meldung nur einmal ausführen. Beim zweiten versuch einen Datensatz zu löschen (ohne Seite neu laden) ist die Meldung weg und es wird einfach so gelöscht.
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 04.12.09 12:04
Der Code sieht äußerst fragil aus.
Ich kenne mich mit Webforms wie gesagt nicht aus (MVC entspricht eher meinem Verständnis eines Webframeworks ), aber es muss doch möglich sein, das onClick-Attribut sofort jedem Löschen-Button zuzuweisen.
_________________ >λ=
|
|
gage
Beiträge: 28
|
Verfasst: Fr 04.12.09 17:41
Das Erste Problem hat sich erledigt:
Ich habe eine PDF Datei im Netz gefunden die genau das Problem beschreibt und einen ganz einfachen Lösungsweg aufzeigt.
Man muss unter Fields auf Convert this field into a TemplateField gehen und dann noch etwas Code einfügen:
Ungefähr so sieht der Code dann aus:
Quelltext 1:
| <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Delete" OnClientClick="return confirm('Wirklich löschen');" Text="Delete"> </asp:LinkButton> </ItemTemplate> </asp:TemplateField> |
2. Problem
Ich versuche nun noch die den Button Aktualiesieren anzufügen. Diese machen kein Update der Tabelle. Daraufhin gehen meine Textboxen auf und zeigen mir meine Validation Controls an. hat da jemand eine idee was ich da Im Code geändert haben könnte.
|
|