【问题标题】:Convert GridView.DataSource with DateTime column to datatable将带有 DateTime 列的 GridView.DataSource 转换为数据表
【发布时间】:2013-08-24 01:24:06
【问题描述】:

我最终尝试对 gridview 进行排序,但是当我转换时:

DataTable dt = (DataTable)gridAllTests.DataSource;

有一个例外 - 无法将对象 DateTime 转换为字符串。

数据源来自数据库sql server,使用Entity 网格视图:

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

【问题讨论】:

  • 请输入更多代码。像 gridAllTests.DataSource=???什么?
  • DataTable dt = (DataTable)gridAllTests.DataSource; 你的datasource 是什么??你确定它的数据表???

标签: c# asp.net entity-framework gridview


【解决方案1】:
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();
            }
        }

如果您使用ToShortDateString(),请不要在boundfield 应用格式,因为日期时间格式不能应用于字符串。 如果您不想使用ToShortDateString(),只需尝试上面没有ToShortDateString() 的代码并在BoundField 使用格式。

【讨论】:

  • 试过了,得到:DataSource 和 DataSourceID 都定义在 'gridAllTests' 上。删除一个定义
  • @Nuni 我希望这是您的完整 aspx 代码,并且您没有在设计页面中使用任何 DatasourceId。我已经更新了答案,检查它是否有效。
  • 但是我不明白为什么你的代码试图将 DateTime 转换为字符串。
  • 我没有在设计页面中使用 DatasourceId。有没有其他方法只显示日期,而不使用将 DateTime 转换为字符串?无论如何,我收到此错误:错误 1 ​​无法将类型“System.Linq.IQueryable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?)
  • 是的,因为当您在查询中使用 New 关键字时,它会创建这些具有匿名类型的对象(对不起),而不是 `IEnumerable 结果`尝试使用 Var 关键字作为 @ 987654330@msdn.microsoft.com/en-us/library/bb386921.aspx
【解决方案2】:

尝试将您的日期对象转换为字符串

test.OnDate.ToString(//format here);

test.LastRegisterDate.ToString(//format here);

我想我遇到过类似的问题,即 DataTable 不知道如何处理 DateTime 对象。

【讨论】:

  • 我应该在哪里添加?
【解决方案3】:

试试这个方法

          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();

【讨论】:

  • 同样的问题,该查询不能使用 dv
猜你喜欢
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多