Benutzer mit den meisten Antworten
Probleme mit GridView und DataKeyNames im CodeBehind

Frage
-
Hallo,
ich möchte aus meinem GridView auf eine neue Seite verlinken und die ID der ausgewählten Reihe übergeben, in dem ich onSelectedIndexChanged eine Sessionvariable setzen und anschließend die Seite umleiten will.
Leider verzweifel ich daran gerade.
Ich baue den Gridview im Codebehind und setze die Row IDs über DataKeyNames:
GridView ReportTbl = new GridView { AutoGenerateColumns = false, ID = "Reports", DataKeyNames = new String[] { "ReportID" } };
Beim Postback über das folgende Feld:
ReportTbl.Columns.Add(new ButtonField { ButtonType = ButtonType.Link, DataTextField = "ReportHeader", HeaderText = "Befund" });
bekomme ich aber immer folgende Fehlermeldung:
Das Element wurde bereits hinzugefügt. Schlüssel im Wörterbuch:ReportID. Hinzuzufügender Schlüssel: ReportID.
Reports_SelectedIndexChanged habe ich auskommentiert, mit meinem Redirect kann es also nicht zusammenhängen.
Kann mir da jemand helfen, ich habe schon alles Mögliche gegoogelt, aber nichts gefunden.
Liegt es vielleicht daran, dass er mit den DataKeyNames im CodeBehind nicht klar kommt? Ich muss das aber im CodeBehind machen.
Viele Grüße
Tamburin
Antworten
-
Hi,
danke für den Tip.
Ich wollte aber gern das gesamte Control im CodeBehind erzeugen, weil nur in gewissen Fällen, abhängig von der Rolle und anderen Faktoren der Gridview dargestellt werden soll.
Ich habe jetzt in ASP.NET Unleashed eine Lösung gefunden:
ReportTbl.Columns.Add(new HyperLinkField { DataTextField = "ReportHeader", HeaderText = "Befund", DataNavigateUrlFields = new String[] { "ReportID" }, DataNavigateUrlFormatString = "reportdetail.aspx?id={0}" });
Damit umgehe ich das PostBack-Problem, muss kein zusätzliches TemplateField einbauen und kann sogar gleich mehrere Variablen über das DataNavigateUrlFields-Array übergeben.
Viele Grüße
Tamburin- Als Antwort markiert Tamburin Dienstag, 27. April 2010 08:13
Alle Antworten
-
Hi,
ich möchte aus meinem GridView auf eine neue Seite verlinken und die ID der ausgewählten Reihe übergeben, in dem ich onSelectedIndexChanged eine Sessionvariable setzen und anschließend die Seite umleiten will.
das kannst Du aber auch einfacher haben.
<asp:TemplateField> <asp:HyperLink ... NavigateUrl='<%# String.Format( "~/Seite.aspx?ID={0}", Container.DataItem.NameDesFelds )' /> </asp:TemplateField>
bzw.
<asp:TemplateField> <asp:HyperLink ... NavigateUrl='<%# String.Format( "~/Seite.aspx?ID={0}", ((<TypDesDataItems)Container.DataItem)( "NameDesFelds" ) )' /> </asp:TemplateField>
Beim Postback über das folgende Feld:
ReportTbl.Columns.Add(new ButtonField { ButtonType = ButtonType.Link, DataTextField = "ReportHeader", HeaderText = "Befund" });
bekomme ich aber immer folgende Fehlermeldung:
Das Element wurde bereits hinzugefügt. Schlüssel im Wörterbuch:ReportID. Hinzuzufügender Schlüssel: ReportID.
wird der Code für "ReportID" als DataKeyName immer ausgeführt? Oder nur dann, wenn kein PostBack durchgeführt wurde?
Wenn ersteres, ändere das (oder schalt den ViewState ab :)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
danke für den Tip.
Ich wollte aber gern das gesamte Control im CodeBehind erzeugen, weil nur in gewissen Fällen, abhängig von der Rolle und anderen Faktoren der Gridview dargestellt werden soll.
Ich habe jetzt in ASP.NET Unleashed eine Lösung gefunden:
ReportTbl.Columns.Add(new HyperLinkField { DataTextField = "ReportHeader", HeaderText = "Befund", DataNavigateUrlFields = new String[] { "ReportID" }, DataNavigateUrlFormatString = "reportdetail.aspx?id={0}" });
Damit umgehe ich das PostBack-Problem, muss kein zusätzliches TemplateField einbauen und kann sogar gleich mehrere Variablen über das DataNavigateUrlFields-Array übergeben.
Viele Grüße
Tamburin- Als Antwort markiert Tamburin Dienstag, 27. April 2010 08:13
-
Ich wollte aber gern das gesamte Control im CodeBehind erzeugen, weil nur in gewissen Fällen, abhängig von der Rolle und anderen Faktoren der Gridview dargestellt werden soll.
Solange Du nicht jedes oder zumindest viele Details des Gridview Controls per Code zuweisen musst, macht das aber keinen Sinn. Wenn es nur um sichtbar oder nicht und ggfs. noch ein, zwei Spalten geht, macht es mehr Sinn, das Control deklarativ zu erstellen und dann im Code (oder per DataBindung Konstrukt <%# %>) die Entscheidung zu treffen, ob das Gridview angezeigt wird oder nicht.
Aber nur, um einen HyperLink zu erstellen, ist das GridView viel zu komplex. Das kannst Du auch mit einem Repeater o.ä. machen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
also ich will schon eine Tabelle haben, die Hyperlinks stehen nur in einer Spalte der Tabelle.
Deshalb habe ich mich für den GridView entschieden, weil ich dort keine Templates definieren muss und automatisch eine Tabelle gerendert wird.Ob ich die Controls in die ASPX packe, kann ich ja nochmal schauen.
Ich dachte mir eben, es sei aus Performancegründen besser, die Controls (können ca. 20 verschiedene je nach Rolle etc. sein) in das Code-Behind zu packen und nur dann darzustellen, wenn sie gebraucht werden, als wenn ich sie alle in die ASPX packe und dann ein- oder ausblende.
Aber da kann ich mich auch irren. Hast du da Erfahrungswerte?
Überlege auch UserControls für verschiedene Rollen einzubinden, aber da muss ich auch nochmal sehen, ob das Sinn macht, weil mein Chef am Liebsten eine detaillierte Rechtevergabe hätte, nach der man die angezeigten Controls dynamisch zusammenstellen kann.
Viele Grüße
Tamburin