Zum Inhalt springen

ASP.NET GridView Problem mit DataKeyNames nach Postback


Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...