DeleteCommand für SqlDataSource

keks1984

Erfahrenes Mitglied
Hallo ich hab ein Problem beim Löschen eines Datensatzes aus der GridView bzw. aus der SQL Server DB. Und zwar hat meine Tabelle eine extra Spalte "Sprache" jede Zeile ist für eine andere Sprache.

Ich fülle jetzt mein GridView im C# Code wie folgt:

string sprache = Session["Sprache"].ToString();

SqlDataSource DS_Mehraufwand = new SqlDataSource();
DS_Mehraufwand.ConnectionString = "Data Source=(local);Database=Web_Stammdaten;Integrated Security=SSPI;";
DS_Mehraufwand.SelectParameters.Add("sprache", sprache);
DS_Mehraufwand.SelectCommand = "SELECT Id, System, Art, Manntage, LKWTage, Material FROM dbo.Mehraufwand WHERE Sprache = @sprache";
DS_Mehraufwand.ID = "DS_Mehraufwand";
Grid_Mehraufwand.DataSource = DS_Mehraufwand;
Grid_Mehraufwand.DataBind();

Das klappt alles prima NUN möchte ich aber je nachdem auch mal eine Zeile löschen. Also benötig ich ein DeleteCommand und da ist mein Problem! Wie bekomme ich das DeleteCommand in den obigen C# Code? Also mir ist schon klar dass der Befehl wie folgt aussieht

DeleteCommand = "DELETE FROM dbo.Mehraufwand WHERE Id = @Id"

ABER wie bekomm ich die Id von der zu löschenden Zeile?

Ich hab auch mal hier meinen asp.net2 Code für die GridView:

<asp:GridView ID="Grid_Mehraufwand" runat="server" AutoGenerateColumns="false"
AllowPaging="True" BackColor="Transparent" BorderColor="Black" DataKeyNames="Id"
ForeColor="Black" HorizontalAlign="Justify" OnRowDataBound="Grid_RowDataBound" BorderStyle="Inset"
EmptyDataText="<% $Resources:message, adminauswahl_Leer%>" AutoGenerateSelectButton="true" >
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Delete" OnClientClick="return confirm('Sollen die Daten wirklich gelöscht werden?');"
Text="<% $Resources:message, loeschen %>" ForeColor="black"/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="System" HeaderText="<% $Resources:message, adminauswahl_System %>" />
<asp:BoundField DataField="Art" HeaderText="<% $Resources:message, adminauswahl_Art %>" />
<asp:BoundField DataField="Manntage" HeaderText="<% $Resources:message, adminauswahl_Manntage %>"/>
<asp:BoundField DataField="LKWTage" HeaderText="<% $Resources:message, adminauswahl_LKWTage %>" />
<asp:BoundField DataField="Material" HeaderText="<% $Resources:message, adminauswahl_Material %>"/>
</Columns>
<HeaderStyle BackColor="Silver" BorderStyle="Inset" />
</asp:GridView>

OK ich hoffe es hat jemand verstanden was ich will :)
 
OH Ja konntest mir helfen hab jetzt bloss noch ein Problem mit dem Aufbau.
Ich weiß nicht wann ich was machen soll bzw. mit welchem Event. Wenn ich das so wie unten beschrieben mache dann meckert er, dass bei der GridRowDeleting() das DS_Mehraufwand nicht bekannt ist.

Hier mal mein C# Code:

protected void GridMehraufwand_Load(object sender, EventArgs e)
{
string sprache = Session["Sprache"].ToString();

SqlDataSource DS_Mehraufwand = new SqlDataSource();
DS_Mehraufwand.ConnectionString = "Data Source=(local);Database=Web_Stammdaten;Integrated Security=SSPI;";
DS_Mehraufwand.SelectParameters.Add("sprache", sprache);
DS_Mehraufwand.SelectCommand = "SELECT Id, System, Art, Manntage, LKWTage, Material FROM dbo.Mehraufwand WHERE Sprache = @sprache";
DS_Mehraufwand.ID = "DS_Mehraufwand";
Grid_Mehraufwand.DataSource = DS_Mehraufwand;
Grid_Mehraufwand.DataBind();
}

protected void GridRowDeleting(object sender, GridViewDeleteEventArgs e)
{
DS_Mehraufwand.DeleteParameters.Add("Id", Convert.ToString(Grid_Mehraufwand.DataKeys[e.RowIndex][0]));
DS_Mehraufwand.DeleteCommand = "DELETE FROM dbo.Mehraufwand WHERE Id = @Id";
}

Und der asp.net2 Code:

<asp:GridView ID="Grid_Mehraufwand" runat="server" AutoGenerateColumns="false"
AllowPaging="True" BackColor="Transparent" BorderColor="Black" DataKeyNames="Id"
ForeColor="Black" HorizontalAlign="Justify" OnRowDataBound="Grid_RowDataBound" BorderStyle="Inset"
EmptyDataText="<% $Resources:message, adminauswahl_Leer%>" AutoGenerateSelectButton="true" OnLoad="GridMehraufwand_Load"
OnRowDeleting="GridRowDeleting">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Delete" OnClientClick="return confirm('Sollen die Daten wirklich gelöscht werden?');"
Text="<% $Resources:message, loeschen %>" ForeColor="black"/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="System" HeaderText="<% $Resources:message, adminauswahl_System %>" />
<asp:BoundField DataField="Art" HeaderText="<% $Resources:message, adminauswahl_Art %>" />
<asp:BoundField DataField="Manntage" HeaderText="<% $Resources:message, adminauswahl_Manntage %>"/>
<asp:BoundField DataField="LKWTage" HeaderText="<% $Resources:message, adminauswahl_LKWTage %>" />
<asp:BoundField DataField="Material" HeaderText="<% $Resources:message, adminauswahl_Material %>"/>
</Columns>
<HeaderStyle BackColor="Silver" BorderStyle="Inset" />
</asp:GridView>
 
Du musst genauso wie in GridMehraufwand_Load "DS_Mehraufwand" erst neu definieren. Ist ja nicht global sondern nur lokal definiert.
Also folgende Zeilen brauchst du auch in deiner Delete-Funktion:
Code:
SqlDataSource DS_Mehraufwand = new SqlDataSource();
DS_Mehraufwand.ConnectionString = "Data Source=(local);Database=Web_Stammdaten;Integrated Security=SSPI;";

Gruß
schmitti81
 
Zurück