C# 将带有DateTime列的GridView.DataSource转换为datatable
我最终尝试对gridview进行排序,但当我转换时:C# 将带有DateTime列的GridView.DataSource转换为datatable,c#,asp.net,entity-framework,gridview,C#,Asp.net,Entity Framework,Gridview,我最终尝试对gridview进行排序,但当我转换时: DataTable dt = (DataTable)gridAllTests.DataSource; 存在一个exeption-无法将对象DateTime转换为字符串 数据源来自数据库sql server,使用实体 GridView: <asp:GridView ID="gridAllTests" runat="server" AutoGenerateColumns="false" DataKeyNames="testId" All
DataTable dt = (DataTable)gridAllTests.DataSource;
存在一个exeption-无法将对象DateTime转换为字符串
数据源来自数据库sql server,使用实体
GridView:
<asp:GridView ID="gridAllTests" runat="server" AutoGenerateColumns="false"
DataKeyNames="testId" AllowSorting="true">
<Columns>
<asp:BoundField DataField="courseName" HeaderText="Course" SortExpression="courseName"/>
<asp:BoundField DataField="onDate" HeaderText="Date" SortExpression="onDate"
DataFormatString="{0:d}" HtmlEncode="false"/>
<asp:BoundField DataField="lastRegisterDate" HeaderText="LastDate"
SortExpression="lastRegisterDate" DataFormatString="{0:d}" HtmlEncode="false"/>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="btnRegister" runat="server" text="Register"
CommandName="Register" CommandArgument='<%#Eval("testId") %>' />
<asp:Literal ID="litAlreadyRegisterd" runat="server" Text="Registered"/>
<asp:Literal ID="litTooLate" runat="server" Text="Registration Over"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
SecondTestEntities1 db = new SecondTestEntities1();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
User currUser = (User)Session["user"];
gridAllTests.DataSource = from test in db.Tests
select new
{
testId= test.TestId,
courseName = test.Course.Name,
onDate = test.OnDate,
lastRegisterDate = test.LastRegisterDate
};
try
{
gridAllTests.DataBind();
DataTable dt = (DataTable)gridAllTests.DataSource;
Session["taskTable"] = dt;
}
catch (Exception err)
{
lblError.Text = err.Message.ToString();
}
}
if (gridAllTests.Rows.Count < 1)
{
lblMessage.Visible = true;
}
}
SecondTestEntities1 db=新的SecondTestEntities1();
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsPostBack)
{
用户currUser=(用户)会话[“用户”];
gridAllTests.DataSource=来自db.Tests中的测试
选择新的
{
testId=test.testId,
courseName=test.Course.Name,
onDate=测试。onDate,
lastRegisterDate=test.lastRegisterDate
};
尝试
{
gridAllTests.DataBind();
DataTable dt=(DataTable)gridAllTests.DataSource;
会话[“任务表”]=dt;
}
捕获(异常错误)
{
lblError.Text=err.Message.ToString();
}
}
if(gridAllTests.Rows.Count<1)
{
lblMessage.Visible=true;
}
}
试试这种方法
DataView dv=(DataView) from test in db.Tests
select new
{
testId= test.TestId,
courseName = test.Course.Name,
onDate = test.OnDate,
lastRegisterDate = test.LastRegisterDate
};
gridAllTests.DataSource = dv;
DataTable dt = new DataTable();
DataSourceSelectArguments args = new DataSourceSelectArguments();
DataView dv = new DataView();
dv = (DataView)dv.Select(args);// This SqlDataSourceObject means your sql query return object ,like dataset or dataview, etc
dt = dv.ToTable();
尝试将日期对象转换为字符串
test.OnDate.ToString(//format here);
test.LastRegisterDate.ToString(//format here);
我想我遇到了一个类似的问题,DataTable不知道如何处理DateTime对象。if(!Page.IsPostBack)
if (!Page.IsPostBack)
{
User currUser = (User)Session["user"];
// Dataset dsGrdDource = new Dataset();
IEnumerable<DataRow> result = from test in db.Tests
select new
{
testId= test.TestId,
courseName = test.Course.Name,
onDate = test.OnDate.ToShortDateString() ,
lastRegisterDate = test.LastRegisterDate
};
DataTable dtgrdSource= query.CopyToDataTable<DataRow>();
try
{
gridAllTests.DataSource =dtgrdSource;
gridAllTests.DataBind();
// DataTable dt = (DataTable)dsGrdDource.Tables[0];
Session["taskTable"] = dtgrdSource;
}
catch (Exception err)
{
lblError.Text = err.Message.ToString();
}
}
{
用户currUser=(用户)会话[“用户”];
//数据集dsGrdDource=新数据集();
IEnumerable结果=以db.Tests为单位的测试结果
选择新的
{
testId=test.testId,
courseName=test.Course.Name,
onDate=test.onDate.ToShortDateString(),
lastRegisterDate=test.lastRegisterDate
};
DataTable dtgrdSource=query.CopyToDataTable();
尝试
{
gridAllTests.DataSource=dtgrdSource;
gridAllTests.DataBind();
//DataTable dt=(DataTable)dsGrdDource.Tables[0];
会话[“任务表”]=dtgrdSource;
}
捕获(异常错误)
{
lblError.Text=err.Message.ToString();
}
}
如果使用的是ToSortDateString()
请不要在boundfield
中应用格式,因为日期时间格式无法应用于字符串。
如果您不想使用
ToSortDateString()
只需在不使用ToSortDateString()
的情况下尝试上述代码,并在BoundField中使用格式设置。请输入更多代码。像gridAllTests.DataSource=???什么?DataTable dt=(DataTable)gridAllTests.DataSource
您的数据源是什么?
?您确定它的数据表吗???我应该在哪里添加它?同样的问题,不能将dv用于该查询tried that and got:数据源和数据源ID都是在“gridAllTests”上定义的。移除一个definition@Nuni我希望这是您的完整aspx代码,并且您在设计页面中没有使用任何数据源ID
。我已经更新了答案检查,看它是否有效。但是我不明白为什么您的代码试图将DateTime转换为字符串。我在设计页面中没有使用数据源ID。是否有其他方法仅显示日期,而不使用将日期时间转换为字符串?无论如何,我得到了这个错误:错误1不能隐式地将类型“System.Linq.IQueryable”转换为“System.Collections.Generic.IEnumerable”。存在显式转换(是否缺少转换?)是,因为当您在查询中使用New
关键字时,它正在创建匿名类型的这些对象(抱歉),而不是“IEnumerable result”,请尝试使用Var
关键字作为Var result=