错误“无法将类型'string'隐式转换为'System.Type'

时间:2010-08-10 04:40:54

标签: c#

我收到格式为“dd-mmm-yyyy”的错误,它应该在绑定到网格时对日期,月份,年份进行排序

“无法将类型'string'隐式转换为'System.Type'”

DataView dw = PurchaseRequestDetails.Tables[0].DefaultView;
DateTime NowDate = System.DateTime.Now;
string NewDate = NowDate.ToString("dd-MMM-yyyy");
dw.Table.Columns["RequiredDate"].DataType = NewDate.ToString();

dw.Sort = "RequiredDate ASC";
foreach (DataRowView dr in dw)
{
    System.Diagnostics.Debug.WriteLine("RequiredDate: " + dr["RequiredDate"].ToString());
}

dgvPurReq.DataSource = dw;
dgvPurReq.DataBind();

5 个答案:

答案 0 :(得分:3)

错误在于: dw.Table.Columns [“RequiredDate”]。DataType = NewDate.ToString();

DataType属性获取或设置存储在所选列中的数据类型。 http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

答案 1 :(得分:2)

您要将列的数据类型设置为字符串的内容,即当前日期时间。当前日期时间不是有效类型。此外,我很确定使用其中的数据更改现有列的数据类型也会引发异常。

如果删除这三行

DateTime NowDate = System.DateTime.Now;
string NewDate = NowDate.ToString("dd-MMM-yyyy");
dw.Table.Columns["RequiredDate"].DataType = NewDate.ToString();

我怀疑这会以你试图让它发挥作用的方式发挥作用。

答案 2 :(得分:2)

string NewDate = NowDate.ToString("dd-MMM-yyyy");
dw.Table.Columns["RequiredDate"].DataType = NewDate.ToString();

第二行是关键;您正在将字符串(NewDate.ToString()to a property that acceptsType作为值进行分配。

在.NET中,所有一个Type,但也有 System.Type的实例。它基本上是一个特殊/特定的类,它描述了另一个类(但实际上并不是该类的一个实例)。一个粗略的比喻就是它就像一个蓝图 - 它描述了一些东西,但它并不是真正的东西。

要检索Type的实例,您可以使用typeof()运算符

答案 3 :(得分:2)

您可以通过使用typeof(DateTime)或DateTime.Now.GetType()将DataType设置为类型来修复它。但我不明白你为什么这样做?返回DataView的行和列列表,从上面的代码中,您只是使用它,为什么要更改数据类型?也许你想要的是格式化显示的数据?

答案 4 :(得分:1)

请在下次包含错误的行号...这有助于 您似乎要将一个字符串分配给DataColumn的DataType属性,该属性需要一个Type对象。所以修复将是......

dw.Table.Columns["RequiredDate"].DataType = NewDate.GetType(); // or typeof(DateTime)

更新(针对问题#2 - 排序不会发生) 改编自this MSDN Page的代码片段(在此处查看辅助方法的实现)。 DataColumn的格式化应该是表示层/使用者的责任。但是,如果您确实需要在DataView中执行此操作 - link

private static void DemonstrateDataView(){
   // Create one DataTable with one column.
   DataTable myTable = new DataTable("myTable");
   DataColumn colItem = new DataColumn("item",typeof(DateTime));

  myTable.Columns.Add(colItem);
   // Add five items.
   DataRow NewRow;
   for(int i = 0; i <5; i++){
      NewRow = myTable.NewRow();
      NewRow["item"] = DateTime.Now.AddDays(-i);
      myTable.Rows.Add(NewRow);
   }
   myTable.AcceptChanges();
   // Print current table values.
   PrintTableOrView(myTable,"Current Values in Table");

   DataView secondView = new DataView(myTable);
   secondView.Sort = "item";

   PrintTableOrView(secondView, "Second DataView: ");
}

输出:

Current Values in Table
        8/10/2010 11:34:28 AM
        8/9/2010 11:34:28 AM
        8/8/2010 11:34:28 AM
        8/7/2010 11:34:28 AM
        8/6/2010 11:34:28 AM

Second DataView: 
        8/6/2010 11:34:28 AM
        8/7/2010 11:34:28 AM
        8/8/2010 11:34:28 AM
        8/9/2010 11:34:28 AM
        8/10/2010 11:34:28 AM