【问题标题】:Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource数据源是无效类型。它必须是 IListSource、IEnumerable 或 IDataSource
【发布时间】:2017-04-25 11:51:47
【问题描述】:

为大学导师建立一个调度系统。我编写了一个在单击按钮时运行的 LINQ 查询,我想在 gridview 中返回可用的插槽。因为查询返回匿名类型,所以数据绑定在标题中抛出错误。我已经在这里寻找修复方法,但查询在控件(此处的按钮)内没有任何内容,所以我不确定如何进行更改。

表格:

CREATE TABLE [dbo].[Sessions] (
[sessionID]              INT           IDENTITY (1, 1) NOT NULL,
[create_date]            DATETIME      NOT NULL,
[last_update_date]       DATETIME      NOT NULL,
[tutorCWID]              INT           NOT NULL,
[semesterID]             INT           NOT NULL,
[session_date]           DATE          NOT NULL,
[session_start_time]     TIME (7)      NOT NULL,
[session_end_time]       NCHAR (10)    NOT NULL,
[session_bookings]       INT           NOT NULL,
[session_group_size]     INT           NOT NULL,
[session_student_report] VARCHAR (500) NULL,
[session_tutor_report]   VARCHAR (500) NULL,
[session_documents]      VARCHAR (100) NULL,
CONSTRAINT [PK_Session] PRIMARY KEY CLUSTERED ([sessionID] ASC),
CONSTRAINT [FK_Session_UserProfileTutor] FOREIGN KEY ([tutorCWID])            REFERENCES [dbo].[UserProfiles] ([userCWID]),
CONSTRAINT [FK_Session_Semester] FOREIGN KEY ([semesterID]) REFERENCES     [dbo].[Semesters] ([semesterID]));

CREATE TABLE [dbo].[UserProfiles] (
[userCWID]     INT           NOT NULL,
[first_name]   VARCHAR (50)  NOT NULL,
[last_name]    VARCHAR (50)  NOT NULL,
[email]        VARCHAR (150) NOT NULL,
[phone_mobile] NUMERIC (18)  NULL,
[phone_work]   NUMERIC (18)  NULL,
[status]       NCHAR (10)    NOT NULL,
[password]     VARCHAR (50)  NOT NULL,
[user_typeID]  INT           NOT NULL,
[ImareUrl]     VARCHAR (50)  NULL,
CONSTRAINT [PK_Tutor] PRIMARY KEY CLUSTERED ([userCWID] ASC),
CONSTRAINT [FK_UserProfile_UserType] FOREIGN KEY ([user_typeID]) REFERENCES [dbo].[UserTypes] ([user_typeID]));

CREATE TABLE [dbo].[UserProfiles_Courses] (
[tutorCWID] INT            NOT NULL,
[courseID]  VARCHAR (50)   NOT NULL,
[note]      NVARCHAR (100) NULL,
CONSTRAINT [PK_UserProfiles_Courses] PRIMARY KEY CLUSTERED ([tutorCWID] ASC, [courseID] ASC),
CONSTRAINT [FK_UserProfiles_Courses_Courses] FOREIGN KEY ([courseID]) REFERENCES [dbo].[Courses] ([courseID]),
CONSTRAINT [FK_UserProfiles_Courses_UserProfiles] FOREIGN KEY ([tutorCWID]) REFERENCES [dbo].[UserProfiles] ([userCWID]));

ASP.NET 代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Students_StudentSelectSession : System.Web.UI.Page
{

string _StdSessCourse = "";
DateTime _StdSessDate = DateTime.Now;
string _semester = "";
protected void Page_Load(object sender, EventArgs e)
{

}
protected void btnStdSessSearch_Click(object sender, EventArgs e)
{
    _StdSessCourse = ddlStdSessCourse.SelectedValue;
    _StdSessDate = calStdSessDate.SelectedDate;


    using (ISDS411_FinalProjectDB_5Entities stdSessEntity = new ISDS411_FinalProjectDB_5Entities())
    {
        var stdSessAvailable = (from s in stdSessEntity.Sessions
                                join up in stdSessEntity.UserProfiles on s.tutorCWID equals up.userCWID
                                join uc in stdSessEntity.UserProfiles_Courses on up.userCWID equals uc.tutorCWID
                                where uc.courseID == _StdSessCourse && s.session_date == _StdSessDate
                                orderby s.session_date
                                select new
                                {
                                    up.first_name,
                                    up.last_name,
                                    s.session_start_time,
                                    s.session_end_time,
                                    s.session_group_size,
                                    s.session_bookings,
                                }).FirstOrDefault();

        gvStdSessAvailable.DataSource = stdSessAvailable;
        gvStdSessAvailable.DataBind();
    }
  }
}

这是网格视图:

<%@ Page Title="Student - Select Tutoring Session" Language="C#" MasterPageFile="~/Students/StudentMasterPage.master" AutoEventWireup="true" CodeFile="StudentSelectSession.aspx.cs" Inherits="Students_StudentSelectSession" %>

<asp:Content ID="Content1" ContentPlaceHolderID="cpMainContent" Runat="Server">
<h1>Select a session</h1>
<p>Use the controls below to select a tutoring session:
    <ol>
        <li>Select the course you want to be tutored in from the dropdown menu.</li>
        <li>Select the date that you are looking for a tutoring session on.</li>
        <li>Click the "Search" button.</li>
    </ol>
</p>
<table>
    <tr>
        <td>
            <asp:DropDownList ID="ddlStdSessCourse" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource2" DataTextField="courseID" DataValueField="courseID"></asp:DropDownList>
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ISDS411_FinalProjectDB_5ConnectionString1 %>" SelectCommand="SELECT [courseID] FROM [Courses]"></asp:SqlDataSource>
        </td>
    </tr>
    <tr>
        <td>
            <asp:Calendar ID="calStdSessDate" runat="server"></asp:Calendar>
        </td>
    </tr>
    <tr>
        <td>
            <asp:Button ID="btnStdSessSearch" runat="server" Text="Search" OnClick="btnStdSessSearch_Click" />
        </td>
    </tr>
    <tr>
        <td>
            <asp:GridView ID="gvStdSessAvailable" runat="server" DataKeyNames="sessionID" EmptyDataText="There are no data records to display." AllowPaging="True" AllowSorting="True"></asp:GridView>
        </td>
    </tr>
</table>
<p><a href="~/Students/StudentHome.aspx" runat="server">Go back to Student Homepage</a></p>

我想这需要匿名类型以外的其他东西,但不知道如何将它们组合在一起。或者,我不能使用网格视图,但我想利用“选择”功能让学生选择他们想要的辅导课程。

【问题讨论】:

  • 谢谢@Stargateur。进行了更改。

标签: c# asp.net linq gridview


【解决方案1】:

尝试更改:.FirstOrDefault();.AsEnumerable();

“我想这需要匿名类型以外的东西,但不知道如何组合起来” 只需创建一个具有属性的新类并像这样使用它:

var stdSessAvailable = (from s in stdSessEntity.Sessions
                            join up in stdSessEntity.UserProfiles on s.tutorCWID equals up.userCWID
                            join uc in stdSessEntity.UserProfiles_Courses on up.userCWID equals uc.tutorCWID
                            where uc.courseID == _StdSessCourse && s.session_date == _StdSessDate
                            orderby s.session_date
                            select new SessAvailable
                            {
                               FirstName = up.first_name,
                               LastName = up.last_name,
                               SessionStarTime = s.session_start_time,
                               SessionEndTime = s.session_end_time,
                               SessionGroupSize = s.session_group_size,
                               SessionBookings = s.session_bookings,
                            }).AsEnumerable();

【讨论】:

  • 谢谢@hekta!我得到 SessAvailable 的类型或命名空间找不到。有任何想法吗?编辑:我使用旁边的小图标为 SessAvailable 创建了一个新类。因此创建了类,但现在“FirstName,LastName”...等被突出显示,表示“SessAvailable”不包含“X”的定义。我该如何添加这些?我是否生成属性存根?属性字段?
  • 我创建了一个“SessAvailable”类,它被添加到 app_code 文件夹中。我把标题放在如下: public class SessAvailable { public string FirstName;公共字符串姓氏;公共时间跨度会话开始时间;公共字符串会话结束时间;公共 int SessionGroupSize; public int SessionBookings;我现在收到此错误:“ID 为 'gvStdSessAvailable' 的 GridView 的数据源没有任何用于生成列的属性或属性。确保您的数据源有内容。”
  • 没问题 Rob P。您是否将这些属性创建为自动实现的属性?
  • 嗨@hekta。我似乎找到了一种让它绑定到网格的方法。我所要做的就是删除“.FirstOrDefault()”,然后在绑定变量之前将“.ToList()”放在变量后面。我在某个地方读到了我必须首先使用或默认使其落后的地方,尽管当我返回多个记录/值时这似乎违反直觉。看来我是对的。不需要枚举。同样感谢您的帮助,非常感谢。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
相关资源
最近更新 更多