2017-01-09 5 views
0

Я выполняю свое школьное задание в приложении для веб-чата. Я хочу, чтобы datalist показывал предыдущий чат в чате, но datalist не появляется.Невозможно показать элементы каталога в 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

Только что выяснилось, что моя переменная запроса равна нулю, но что мне нужно сделать, чтобы вставить запрос 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; }); 

и она работает, спасибо.

Смежные вопросы