2017-01-09 5 views
0

私はWebチャットアプリケーションで私の学校の割り当てをしています。以前のチャットをチャットボックスに表示するには、データリストを使用しますが、データリストは表示されません。データリストアイテムをC#で表示できません

これが.aspxの中に私のコードです:

<asp:DataList ID="DataList3" runat="server"> 
    <ItemTemplate runat="server"> 
     <div class="lv-item media"> 
      <div class="lv-avatar pull-left"> 
       <asp:Image ID="Image4" runat="server" ImageUrl='<%# Bind("Image") %>' /> 

      </div> 
      <div class="media-body"> 
       <div class="ms-item"> 
        <span class="glyphicon glyphicon-triangle-left" style="color: #000000;"></span> 
        <asp:Label ID="Message" runat="server" Text='<%# Bind("Message") %>'></asp:Label> 
       </div> 
       <small class="ms-date"><span class="glyphicon glyphicon-time"></span>&nbsp; 
        <asp:Label ID="Date" runat="server" Text='<%# Bind("Time") %>'></asp:Label></small> 
      </div> 
     </div> 
    </ItemTemplate> 
</asp:DataList> 

そして、これは.csファイルで私のコードです:

public void LoadChatbox() 
{ 
    Session["Name"] = "weiwei"; 
    int waiwai = 1004; 
    //Request.QueryString["friendid"] = "waiwai"; 
    Session["userid"] = 1005; 

    int userid = int.Parse(Session["userid"].ToString()); 
    //int receiverid = int.Parse(Request.QueryString["friendid"]); 
    int receiverid = waiwai; 
    string name = Session["Name"].ToString(); 
    DataSet ds = new DataSet(); 
    ds.Locale = System.Globalization.CultureInfo.InvariantCulture; 
    IEnumerable<DataRow> query = 
    (from user in db.Users.AsEnumerable() 
    join ch in db.ChatHistories.AsEnumerable() 
     on user.Userid equals ch.Senderid 
    where ch.Senderid == userid && ch.Receiverid == receiverid || ch.Receiverid == userid && ch.Senderid == receiverid orderby ch.id 
    select new 
    { 
     Image = user.image, 
     Message = ch.message, 
     Time = ch.dateTime 
    }) 
    as IEnumerable<DataRow>; 

    DataTable chatbox = query.CopyToDataTable<DataRow>(); 
    ds.Tables.Add(chatbox); 
    DataList3.DataSource = ds; 
    DataList3.DataBind(); 
} 

答えて

0
select new 
{ 
    Image = user.image, 
    Message = ch.message, 
    Time = ch.dateTime 
}) 
as IEnumerable<DataRow>; 

as IEnumerable<DataRow>は、あなたのquery変数は以来nullことを引き起こしていますクエリは、DataRowオブジェクトのコレクションではなく、匿名型のコレクションになります。

DataRowアイテムに投影するか、他の手段を使用してDataTableを埋め込む必要があります。

また、必要でない場合は、クエリ内のデータセットに.AsEnumerable()を指定しないでください。テーブル全体が強制的にメモリにロードされ、データベース上ではなくLinqで結合が行われます。 AsEnumerableを削除すると問題が発生する場合は、これらの問題を解決する別の方法を見つける必要があります。

+0

私のクエリ変数がnullであることがわかりましたが、DataTableにlinqクエリを挿入するにはどうすればよいですか? –

+0

私が言ったように、データ行のリストに投影するか、匿名コレクションからデータテーブルに行を追加します。それを行う方法について他の質問や例があります。 –

0

私はこれに私のコードを変更:

   var chatbox = new DataTable(); 
     chatbox.Columns.Add("Image", typeof(string)); 
     chatbox.Columns.Add("Message", typeof(string)); 
     chatbox.Columns.Add("Time", typeof(DateTime)); 
     (from user in db.Users.AsEnumerable() 
     join ch in db.ChatHistories.AsEnumerable() 
      on user.Userid equals ch.Senderid 
     where ch.Senderid == userid && ch.Receiverid == receiverid || ch.Receiverid == userid && ch.Senderid == receiverid 
     orderby ch.id 
     select new 
     { 
      Image = user.image, 
      Message = ch.message, 
      Time = ch.dateTime 
     }) 
     .Aggregate(chatbox, (dt, r) => { dt.Rows.Add(r.Image, r.Message, r.Time); return dt; }); 

、それが動作します、ありがとう。

関連する問題