2009-11-04 9 views
6

Ich habe eine <asp:Repeater> in meiner Webseite, die an einen programmatisch erzeugten Datensatz gebunden ist.ASP.NET Repeater und DataBinder.Eval

Der Zweck dieses Repeaters besteht darin, einen Index von A-Z zu erstellen, der beim Anklicken die Informationen auf der Seite aktualisiert.

Der Repeater hat eine Link-Taste wie folgt:

<asp:LinkButton ID="indexLetter" Text='<%#DataBinder.Eval(Container.DataItem,"letter")%>' 
runat="server" CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>' 
Enabled='<%#DataBinder.Eval(Container.DataItem,"enabled")%>'></asp:LinkButton> 

Der Datensatz auf folgende Weise erstellt:

protected DataSet getIndex(String index) 
    { 
     DataSet ds = new DataSet(); 
     ds.Tables.Add("index"); 
     ds.Tables["index"].Columns.Add("letter"); 
     ds.Tables["index"].Columns.Add("cssclass");    
     ds.Tables["index"].Columns.Add("enabled"); 
     char alphaStart = Char.Parse("A"); 
     char alphaEnd = Char.Parse("Z"); 
     for (char i = alphaStart; i <= alphaEnd; i++) 
     { 
      String cssclass="", enabled="true"; 
      if (index == i.ToString()) 
      { 
       cssclass = "selected"; 
       enabled = "false"; 
      } 
      ds.Tables["index"].Rows.Add(new Object[3] {i.ToString(),cssclass,enabled }); 
     } 
     return ds; 
} 

Allerdings, wenn ich die Seite ausführen, wird ein „angegebene Ziel ungültig ist Ausnahme "ist in Text='<%#DataBinder.Eval(Container.DataItem,"letter")' geworfen. Ich habe keine Ahnung warum, ich habe versucht, manuell zu String mit (String) zu werfen, ich habe versucht, eine ToString() -Methode, ich habe alles versucht.

Wenn ich im Debugger eine Überwachung für DataBinder.Eval (Container.DataItem, "letter") hinzufüge, ist der Wert, den es zurückgibt, "A", was meiner Meinung nach für die Texteigenschaft in Ordnung sein sollte.

EDIT:

Hier ist die Ausnahme: "angegebene Ziel ungültig ist"

System.InvalidCastException unhandled war durch Benutzercode
Message = Source = "App_Web_cmu9mtyc"
Stacktrace: bei ASP.savecondition_aspx .__ DataBinding__control7 (Object sender, EventArgs e) in e: \ Dokumente und Einstellungen \ Fernando \ Eigene Dateien \ Visual Studio 2008 \ Projects \ mediTrack \ mediTrack \ saveCondition. aspx: Leitung 45 bei System.Web.UI.Control.OnDataBinding (EventArgse) bei System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) bei System.Web.UI.Control.DataBind() bei System .Web.UI.Control.DataBindChildren() Innerexception:

werden Jede Beratung sehr geschätzt, danke

BEARBEITEN 2: Behoben! Das Problem war nicht in den Text- oder CSS-Tags, aber im Enabled-Tag musste ich es auf einen booleschen Wert umwandeln. Das Problem war, dass die Ausnahme im Text-Tag signalisiert wurde, weiß ich nicht, warum

+0

sind Sie sicher, dass die Ausnahme auf dem „Brief“ und nicht der „freigegeben“ Teil? –

+0

Sie hatten Recht zarembisty! Es war das, ich habe nie versucht, nur das Eval aus dem aktivierten Eigentum zu entfernen ... Danke! – Fernando

+0

Ich wünschte, MS würde niemals die Seite binden. Wäre so viel besser, wenn du es NUR aus dem Code-Behind tun könntest, um diese Fragen zu vermeiden. – Phill

Antwort

0

Ich weiß nicht, ob dies einen Unterschied machen, aber versuchen, für folgende (Anmerkung zu Abstand)

<asp:LinkButton ID="indexLetter" Text='<%# Eval("letter")%>' 
runat="server" CssClass='<%# Eval("cssclass")%>' 
Enabled='<%# Eval("enabled")%>'></asp:LinkButton> 
+0

hat es auch nicht funktioniert ... Ich weiß wirklich nicht was los ist! – Fernando

1

Aus dem Beispiel, das Sie angegeben haben, benötigen Sie kein Dataset, nur die Datentabelle. Außerdem geben Sie den Datentyp für die Spalte nicht an.

DataTable indexTable = new DataTable(); 
indexTable.Columns.Add("letter", typeof(string)); 

//do stuff 

_repeater.DataSource = indexTable; 
_repeater.DataBind(); 

und zu bewerten, wie dies

Text='<%# Eval("letter")%>' 
+0

Leider passiert es immer noch, wenn ich es so mache (Hinzufügen des Datentyps zu der Spalte, und nur mit einer dataTable) Ich bearbeitet den Beitrag, um die Ausnahme verfolgen zu lassen – Fernando

0

Nicht die Übung zu verderben, aber was mit harter Codierung falsch:

<a href="Page.aspx?LIndex=A">A</a> 
<a href="Page.aspx?LIndex=B">B</a> 
<a href="Page.aspx?LIndex=C">C</a> 
... 
<a href="Page.aspx?LIndex=Z">Z</a> 
+4

Noooo! Das ist schrecklich. Eine einfache <% for (...) {%> Schleife würde dies jedoch viel einfacher machen. – James

0

Es ist wie die Frage sieht mit dem Wert Enabled - es muss boolesch sein.

Dies funktioniert:

 <asp:LinkButton ID="indexLetter" Text='<%# this.FooData()%>' 
     runat="server" CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>' 
     Enabled='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem,"enabled"))%>'></asp:LinkButton>