Kaoru Geschrieben 13. März 2008 Teilen Geschrieben 13. März 2008 Hallo zusammen, ich habe ein merkwürdiges und mittlerweile echt frustrierendes Problem... Ich erstelle zwei CompositeControls, eines wird direkt auf der ASP Seite eingebunden, das andere wird zur Laufzeit erzeugt und dann auf dem ersten CompositeControl angezeigt. Auf dem zweiten Control befindet sich u.a. ein GridView. Diesem weise ich eine DataTable als DataSource und entsprechende Primarykeys zu. Beim ersten Aufruf funktioniert auch alles wie erwartet, nur nach einem Postback wird mir folgende Fehlermeldung geschmissen: Das Element wurde bereits hinzugefügt. Schlüssel im Wörterbuch:ID. Hinzuzufügender Schlüssel: ID. ID ist in diesem Fall meine PK-Spalte in der Datenbank. Soweit so gut, nun ist es jedoch leider so, dass der Fehler nicht geworfen wird, während ich dem GridView die DataKeyNames zuweise sondern irgendwann später... (Nach dem Postback sind die DataKeyNames des Grids null) Wo genau der Fehler geworfen wird weiß ich nicht... Zu Anfang wurde der Fehler geworfen, wenn ich dem ersten Control das zweite zuweisen wollte, doch nach ewigen herumbasteln scheint auch das zu funktionieren... Ich bin echt am verzweifeln, weil ich nichteinmal mehr die Stelle herausbekomme, an der der Fehler erzeugt wird. Sowohl das CreateChildControl des übergeordneten, wie auch das des CompositeControls mit dem GridView laufen Problemlos durch... Kennt jemand dieses Verhalten oder kann mir einen Tip geben, wo der Fehler noch herkommen kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaoru Geschrieben 14. März 2008 Autor Teilen Geschrieben 14. März 2008 Hi, ich schon wieder... Ich komme immer noch nicht weiter, habe jetzt aber wenigstens wieder den Zustand, dass ich sehe, an welcher Stelle der Fehler geworfen wird... Mein Code: Das erste CompositeControl (welches direkt auf der ASP Seite liegt) protected override void CreateChildControls() { _dbHandler.LoadData(_configuration.DataSetSchema, _configuration.SelectStatement); DefaultView dv = new DefaultView(_dbHandler.FullDataTable, _configuration.DefaultViewColumns); this.Controls.Add(dv); base.CreateChildControls(); } Das zweite CompositeControl, das oben erstellt wird: private DataTable _data; private Data.MDA_DataColumn[] _defaultColumns; private GridView _grid; public DefaultView(DataTable data, Data.MDA_DataColumn[] defaultViewColumns) { _data = data; _defaultColumns = defaultViewColumns; } protected override void CreateChildControls() { _grid = new GridView(); _grid.AutoGenerateColumns = false; _grid.ID = this.ID + "_grid"; // Columns erstellen [...] if (_grid.DataKeyNames.Length == 0) { String[] keys = {"ShipperID"}; _grid.DataKeyNames = keys; } _grid.DataSource = _data; _grid.DataBind(); this.Controls.Add(_grid); base.CreateChildControls(); } und falls das irgendwie hilft, hier die aspx Seite: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Assembly="MDA" Namespace="MDA" TagPrefix="cc1" %> <!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>Unbenannte Seite</title> </head> <body> <form id="form1" runat="server"> <div> <cc1:mda id="MDA1" runat="server"></cc1:mda> </div> </form> </body> </html> Code behind gibt es nicht. Wenn ich im ersten Control OnInit überschreibe und von dort EnsureChildControls aufrufe und im zweiten Control EnsureChildControls im Konstruktor aufrufe, dann kann ich die Stelle, an der der Fehler auftritt nicht mehr lokalisieren. Wenn ich EnsureChildControls aus dem Konstruktor des zweiten Controls entferne, dann wird der Fehler beim Hinzufügen des GridViews auf das Control geworfen (aber nicht beim Zuweisen der DataKeyNames). Die ControlsCollection des Controls ist in diesem Moment leer... Habe ich EnsureChildControls im Konstruktor aber nicht in OnInit, dann wird der Fehler geworfen, wenn ich das zweite Control dem ersten zuweise. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.