Hallo Miteinander,
ich bin schon einige Zeit mit einem Problem beschäftigt, zu dem ich allerdings leider keine Lösung finde.
Zur Vereinfachung habe ich das Problem auf die Demo-Datenbank AdventureWorks vom SQL-Server angepasst und auf das wesentliche Reduziert, um die Namen der ProductSubcategories zu zu einzelnen ProductCategories zu bearbeiten.
Ich habe ein Web-Benutzersteuerelement erstellt, welches in einem GridView dargestellt und editiert werden soll.
Das Darstellen funktioniert auch ohne probleme, allerdings klappt das Bearbeiten nicht. Immer wenn ich auf "Bearbeiten" klicke, verschwinden die Daten.
Wenn ich das Control direkt auf das Form einfüge (ohne Grid), funktioniert es und die Daten werden auch in der Datenbank aktualisiert.
In dem Control ist eine private Variable, welche die ProductCategory speichert. Beim debuggen habe ich allerdings festgestellt, dass diese Variable nach dem laden leer ist.
Zum besseren Verständnis habe ich hier den Code:
WebForm.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="AdventureWorks.WebForm" %>
<%@ Register src="SubCategory.ascx" tagname="SubCategories" tagprefix="uc1" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
<asp:Label runat="server" Font-Bold="true">1. Control direkt auf Formular</asp:Label>
<uc1:SubCategories ID="ctlSubCategories" runat="server" ProductCategoryID='1'/>
<br /><br />
<asp:Label ID="Label1" runat="server" Font-Bold="true">2. Control in GridView</asp:Label>
<asp:FormView ID="FormView1" runat="server"
DataSourceID="dsCategories" >
<ItemTemplate>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" ShowHeader="false"
DataKeyNames="ProductCategoryID" DataSourceID="dsCategories" BorderStyle="None">
<Columns>
<asp:TemplateField ItemStyle-BorderStyle="None" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<uc1:SubCategories ID="ctlCategories" runat="server" ProductCategoryID='<%# Eval("ProductCategoryID", "{0}") %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:FormView>
</p>
</div>
<asp:SqlDataSource ID="dsCategories" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
SelectCommand="SELECT distinct ProductCategoryID FROM [AdventureWorks].[Production].[ProductSubcategory] WHERE ProductCategoryID = 1">
</asp:SqlDataSource>
</form>
</body>
</html>
WebForm.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
namespace AdventureWorks
{
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
namespace AdventureWorks
{
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
SubCategory.ascx
Sub
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SubCategory.ascx.cs" Inherits="AdventureWorks.WebUserControl3" %>
<%@ Import Namespace="AdventureWorks" %>
<p>
<asp:FormView ID="FormView1" runat="server" DataSourceID="dsSubCategories">
<EditItemTemplate>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" ShowHeader="false" ShowFooter="false"
DataKeyNames="ProductSubcategoryID" DataSourceID="dsSubCategories" BorderStyle="None" >
<Columns>
<asp:BoundField DataField="ProductSubcategoryID" Visible="false" HeaderText="ProductSubcategoryID" SortExpression="ProductSubcategoryID" ReadOnly="true" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" ItemStyle-Width="106" ControlStyle-Width="100" ItemStyle-BorderWidth="0" ItemStyle-HorizontalAlign="Right" />
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ButtonType="Link" />
</Columns>
</asp:GridView>
</EditItemTemplate>
</asp:FormView>
</p>
<asp:SqlDataSource ID="dsSubCategories" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [AdventureWorks].[Production].[ProductSubcategory] WHERE [ProductCategoryID] = @ProductCategoryID"
UpdateCommand="UPDATE [AdventureWorks].[Production].[ProductSubcategory] SET [Name] = @Name WHERE [ProductSubcategoryID] = @original_ProductSubcategoryID"
OnSelecting="_data_Selecting">
<UpdateParameters>
<asp:Parameter Name="ProductSubcategoryID" Type="String" />
<asp:Parameter Name="Name" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
SubCategory.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AdventureWorks
{
public partial class WebUserControl3 : System.Web.UI.UserControl
{
protected void _data_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
System.Data.Common.DbParameter dbPar = new System.Data.SqlClient.SqlParameter();
dbPar.DbType = System.Data.DbType.String;
dbPar.ParameterName = "ProductCategoryID";
dbPar.Value = strProductCategoryID;
e.Command.Parameters.Add(dbPar);
}
private string strProductCategoryID;
public string ProductCategoryID
{
get { return strProductCategoryID; }
set { strProductCategoryID = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
FormView1.DefaultMode = FormViewMode.Edit;
}
}
}
Hat jemand vielleicht eine Idee, wie die Variable erhalten bleibt?
Vielen Dank schon einmal im Voraus und Grüsse
Andreas