2009-11-04 3 views
6

У меня есть <asp:Repeater> на моей веб-странице, которая привязана к программно созданному набору данных.ASP.NET Repeater и DataBinder.Eval

Целью этого ретранслятора является создание индекса из A-Z, который при нажатии обновляет информацию на странице.

Ретранслятор имеет кнопку ссылку, например, так:

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

Набор данных создается следующим образом:

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

Однако, когда я бегу страницы, то «Указанного бросок не действителен исключение "выбрасывается в Text='<%#DataBinder.Eval(Container.DataItem,"letter")'. Я понятия не имею, почему, я пробовал вручную кастинг в String с (String), я пробовал метод ToString(), я пробовал все.

Кроме того, если в отладчике я добавляю часы для DataBinder.Eval (Container.DataItem, «letter»), возвращаемое значение «A», которое, по моему мнению, должно быть прекрасным для Text Property.

EDIT:

Вот исключение:

System.InvalidCastException был необработанным кодом пользователя
Message = "Указанный бросок не является действительным." Источник = "App_Web_cmu9mtyc"
StackTrace: на ASP.savecondition_aspx .__ DataBinding__control7 (отправитель объекта, EventArgs е) в е: \ Documents и Settings \ Фернанду \ Мои документы \ Visual Studio 2008 \ Projects \ mediTrack \ mediTrack \ saveCondition. ASPX: линия 45 на System.Web.UI.Control.OnDataBinding (EventArgs е) в System.Web.UI.Control.DataBind (Boolean raiseOnDataBinding) в System.Web.UI.Control.DataBind() в системе .Web.UI.Control.DataBindChildren() InnerException:

Любые советы будут с благодарностью, спасибо

EDIT 2: Исправлено! Проблема не была в тегах Text или CSS, но в теге Enabled мне пришлось отбросить ее до логического значения. Проблема заключалась в том, что исключение сигнализировал в текстовом теге, я не знаю, почему

+0

вы уверены, исключение составляет на «букву» а не «включена» часть? –

+0

вы были правы zarembisty! это было то, что я никогда не пытался удалить только Eval из включенной собственности ... спасибо! – Fernando

+0

Я хочу, чтобы MS никогда не привязывала страницу к странице. Было бы намного лучше, если бы вы могли ТОЛЬКО делать это из кода, чтобы избежать этих вопросов. – Phill

ответ

0

Я не знаю, если это будет делать какие-либо различия, но попробовать следующее (расстояние примечание тоже)

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

это тоже не сработало ... Я действительно не знаю, что происходит! – Fernando

1

В примере, который вы указали, вам не нужен набор данных, просто данные. Также вы не указываете тип данных для столбца.

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

//do stuff 

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

И оценить, как этот

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

К сожалению, это все равно, если я сделаю это так (добавление типа данных в столбец и только с использованием dataTable) Я отредактировал сообщение, чтобы оставить следы исключений – Fernando

0

, чтобы не портить упражнение, но то, что случилось с жестким кодированием:

<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! Это ужасно. Простой цикл <% for (...) {%> сделает это намного проще. – James

0

Похоже, что вопрос находится с Enabled значения - это должно быть логическим.

Это работает:

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