2010-08-10 214 views
0

我遇到格式为”dd-mmm-yyyy“的排序错误,它应该在绑定到网格时对日期,月份,年份进行排序错误“无法将类型'字符串'隐式转换为'System.Type'

“无法隐式‘串’转换为‘的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(); 
+1

如果您希望与.NET Framework命名约定一致,请使用camelCase(而不是PascalCase)作为本地变量。 – zneak 2010-08-10 04:45:43

回答

2

要设置列到这是当前日期时间的字符串的内容的数据类型。目前的日期时间不是一个有效的类型,而且,我确信使用数据改变现有列的数据类型也会引发异常,

如果去掉这三行

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

我怀疑这会工作,你正试图得到它的工作方式。

1

请在下次包括错误的行号......因为这有帮助。
看来你正在给DataColumn的DataType属性赋值一个字符串,该属性需要一个Type对象。因此,修复会...

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

更新(对问题#2 - 排序不发生) 从代码片段改编自this MSDN Page(看看这里的执行的辅助方法)。 DataColumn的格式应该是表示层/消费者的责任。但是,如果你真的需要做到这一点的数据视图 - 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 
+0

其未来格式正确,但排序不会发生 – 2010-08-10 04:54:57

+0

@vigna ...它为我工作。第二个DataView按Asc顺序排序。将你的代码与上面的代码进行比较,找出差异。 – Gishu 2010-08-10 06:09:09

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

第二行是关键;你正在分配一个字符串(NewDate.ToString()to a property that accepts a Type作为一个值。

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

要检索Type的实例可以使用typeof()操作

2

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

+0

我需要根据日期,年份和月份在服务器端执行此格式的排序dd-MMM-yyyy – 2010-08-10 05:05:29

+0

好吧我现在明白了。但是,那么你的代码不够有代表性。您已经添加了列并使用它,但您尚未将该值分配给该新列。 – 2010-08-10 05:27:37