c#
  • .net
  • asp.net
  • data-binding
  • repeater
  • 2009-11-04 47 views 6 likes 
    6

    プログラムで作成されたデータセットにバインドされている私のWebページに<asp:Repeater>があります。ASP.NETリピータと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)でキャストしようとしています、私はToString()メソッドを試してみました、私はすべてを試してみました。

    また、デバッガでDataBinder.Eval(Container.DataItem、 "letter")のウォッチを追加すると、返される値は「A」になります。これは私にとってTextプロパティにとっては問題ありません。

    編集:ここでは

    は例外です:

    System.InvalidCastExceptionのは=ユーザーコード
    メッセージによって、未処理だった "指定されたキャストは有効ではありません。"プロジェクト\ mediTrack \ mediTrack \ saveCondition \ \ DocumentsとSettings \フェルナンド\マイ ドキュメントのVisual Studio \ 2008:ソース= "App_Web_cmu9mtyc"
    のStackTrace:電子内ASP.savecondition_aspx .__ DataBinding__control7(オブジェクト送信者、EventArgsの電子)で 。 aspx:行45 at System.Web.UI.Control.OnDataBinding(EventArgs e) at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System .Web.UI.Control.DataBindChildren()InnerException:

    アドバイスをよろしくお願いします。

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

    問題は、有効値であるように見えます - それはブール値である必要があります。

    これは動作します:あなたは、例外が「文字」ではなく「有効」部分にある特定の

     <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> 
    
    関連する問題