Zum Inhalt springen

ASP.NET GridView Problem mit DataKeyNames nach Postback


Kaoru

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...