2009-04-24 23 views
0

私はコードビハインドでデータソースを設定するリストビューを持っています。これはうまくいきます。 リストビューのitemtemplateに別のリストビュー(またはデータバインドコントロール)を追加し、そのコントロールのデータソースをコードビハインドに設定すると、クエリによって返されたフィールドはネストされたリストビューで使用できないように見えます。 ASP.NETは次のエラーをスローします。DataBinding: 'System.String'には名前が 'j_Name'のプロパティが含まれていません。ネストされたlistviewデータバインディング - プロパティが見つかりませんか?

下の例では、d_Descriptionはうまく動作しますが、j_Roleは上記のエラーをスローします。私はデータがクエリによって返されるのを見ることができ、カラム名が一致していることを知っているので、エラーの原因は何ですか(どのように解決しますか)。

ASPXページ

<asp:ListView ID="LV1" runat="server"> 
    <LayoutTemplate> 
     <table runat="server" id="tblSummary"> 
      <tr runat="server" id="itemPlaceholder" /> 
     </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <%#Eval("d_Description")%> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <asp:ListView ID="LV2" runat="server"> 
        <ItemTemplate> 
         <%#Eval("j_Role")%> 
        </ItemTemplate> 
        <LayoutTemplate> 
         <asp:placeholder id="itemPlaceholder" runat="server" /> 
        </LayoutTemplate> 
       </asp:ListView> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

の背後にあるコード

var qry1 = from q in context.Descriptions select q.d_Description; 
LV1.DataSource = qualificationQry; 
LV1.DataBind(); 

var qry2 = from q in context.Roles select q.j_Role; 
LV2.DataSource = qualificationQry; 
LV2.DataBind(); 

EDIT: 私は外リストビューのItemDataBoundイベントに以下のようなコードを追加した、と私はまだ遭遇しています同じエラー。おそらく私はインストラクターを誤解していますか?

protected void LV_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    using (dbDataContext context = new dbDataContext() 
    { 
     var qry2 = from q in context.Roles select q.j_Role; 

     ListView tempLV = (ListView)e.Item.FindControl("LV2"); 
     tempLV.DataSource = qry2; 
     tempLV.DataBind(); 
    } 
} 

EDIT:2 ウェブの周りにいくつかのより多くを読んだ後(今私はを検索するかのアイデアを持っていることを)提案した答えが正解のようです - しかし、それは働いていない - 誰でも提案することができますどうして?

編集:私はj_Nameの出力を捨てて、ただ、ハードコードの文字列を持っている場合は3 は、エラーがない、そして、ハードコード文字列は倍の数の期待値をouputs。これは、正確な列名を持つクエリからデータセットが戻ってくるのを見ることはできますが、列名(j_Name)が間違っていることを示しています。

EDIT:4 修正済みです。 これは、これはあなたが外側のリストについては、​​に外リストのすべての行に内側のリストをバインドする必要が var qry2 = from q in context.Roles select q;

答えて

2

正しい var qry2 = from q in context.Roles select q.j_Role; 間違っています。

ので、このコード:

var qry2 = from q in context.Roles select q.j_Role; 
LV2.DataSource = qualificationQry; 
LV2.DataBind(); 

は外リストItemDataBoundイベントのためにも、ハンドラ内で移動する必要があります:

protected void ContactsListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
    // Bind the inner list on every repeat of the outer list 
    var qry2 = from q in context.Roles select q.j_Role; 
    LV2.DataSource = qualificationQry; 
    LV2.DataBind(); 
    } 
} 

そして、おそらくあなたは、内側の値をフィルタ処理したいと思います外側のリストの現在の項目からの値に基づいたリスト

+0

ありがとう、しかし少し具体的にすることはできますか? – user9659

+0

より具体的に編集 - ItemDataBoundのmsdnドキュメントへのリンクがあります。詳細情報が必要な場合は –

+0

元の質問に私の編集を参照してください - あなたが提案したことを実行しましたが、私はまだ同じエラーが発生しています私はイベントが呼び出されているのを見ることができ、データがDBから戻ってきて、私はまだシステムを取得しています。 – user9659

関連する問題