2009-11-04 43 views
6

Tengo un <asp:Repeater> en mi página web, que está vinculado a un conjunto de datos creado por programación.ASP.NET Repeater y DataBinder.Eval

El propósito de este repetidor es crear un índice desde A-Z, que, al hacer clic, actualiza la información en la página.

El repetidor tiene un botón de enlace, así:

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

El conjunto de datos se crea de la siguiente manera:

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; 
} 

Sin embargo, cuando corro a la página, una "conversión especificada no es válida excepción "se lanza en Text='<%#DataBinder.Eval(Container.DataItem,"letter")'. No tengo idea de por qué, intenté convertir manualmente a String con (String), probé un método ToString(), lo intenté todo.

Además, si en el depurador agrego un reloj para DataBinder.Eval (Container.DataItem, "letter"), el valor que devuelve es "A", que según yo, debería estar bien para Text Property.

EDIT:

Aquí es la excepción:

System.InvalidCastException era controlada por el código de usuario
mensaje = "la conversión especificada no es válida." Fuente = "App_Web_cmu9mtyc"
StackTrace: en ASP.savecondition_aspx .__ DataBinding__control7 (Object sender, EventArgs e) en E: \ Documents and Settings \ Fernando \ Mis documentos \ Visual Studio 2008 \ Projects \ mediTrack \ mediTrack \ saveCondition. aspx: línea 45 en System.Web.UI.Control.OnDataBinding (EventArgs e) en System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) en System.Web.UI.Control.DataBind() en Sistema .Web.UI.Control.DataBindChildren() InnerException:

será muy apreciada Cualquier consejo, gracias

EDITAR 2: ¡Reparado! El problema no estaba en las etiquetas de texto o CSS, pero en la etiqueta Habilitado, tuve que convertirlo a un valor booleano. El problema era que la excepción fue señalado en la etiqueta de texto, no sé qué

+0

¿está seguro de la excepción está en la "letra" y no el "activado" parte? –

+0

¡estabas en lo cierto! fue eso, nunca intenté eliminar solo el Eval de la propiedad habilitada ... ¡gracias! – Fernando

+0

Deseo que MS nunca ponga enlaces en la página. Sería mucho mejor si SOLO pudieras hacerlo desde el código subyacente para evitar estas preguntas. – Phill

Respuesta

0

no sé si esto hará ninguna diferencia, pero trata de seguir (espaciado de notas también)

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

tampoco funcionó ... ¡Realmente no sé lo que está pasando! – Fernando

1

Según el ejemplo que ha proporcionado, no necesita un conjunto de datos, solo la tabla de datos. Además, no especifica el tipo de datos para la columna.

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

//do stuff 

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

y evaluar como esto

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

desafortunadamente, todavía sucede si lo hago de esta manera (agregando el tipo de datos a la columna, y solo usando una dataTable) Edité la publicación para dejar la traza de excepción – Fernando

0

Para no estropear el ejercicio, pero ¿qué pasa con la codificación dura:

<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! Esto es horrible. Un simple <% for (...) {%> loop haría esto mucho más simple. – James

0

Parece que el problema es con el valor Activado - se necesita ser booleano

Esto funciona:

 <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> 
Cuestiones relacionadas