2017-01-09 38 views
0

我正在上网聊天应用程序上完成我的学校任务。我希望使用数据列表在聊天框中显示以前的聊天记录,但数据列表不显示。无法显示C#中的datalist项目

这是我的.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

刚刚发现我的查询变量为空,但我该怎么做才能将linq查询插入到DataTable中? –

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

和它的作品,谢谢。

相关问题