【问题标题】:Error"Cannot implicitly convert type 'string' to 'System.Type'错误“无法将类型 'string' 隐式转换为 'System.Type'
【发布时间】:2010-08-10 04:40:54
【问题描述】:

我收到“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();

【问题讨论】:

  • 如果要与 .NET Framework 命名约定保持一致,请对局部变量使用 camelCase(而不是 PascalCase)。

标签: c#


【解决方案1】:

错误在以下行: dw.Table.Columns["RequiredDate"].DataType = NewDate.ToString();

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

【讨论】:

    【解决方案2】:

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

    如果你删除这三行

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

    我怀疑这将按照您尝试使其工作的方式工作。

    【讨论】:

      【解决方案3】:
      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。它基本上是一个特殊/特定的类,它描述了另一个类(但实际上不是该类的实例)。一个粗略的比喻是它就像一个蓝图——它描述了一些东西,但它不是真实的东西。h

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我需要在服务器端 coing dd-MMM-yyyy 中根据日期、年份、月份以这种格式进行排序
        • 好的,我现在明白了。但是你的代码不够有代表性。您已添加并使用该列,但尚未将值分配给该新列。
        【解决方案5】:

        请在下次填写错误的行号...这样会有所帮助。
        您似乎正在为 DataColumn 的 DataType 属性分配一个字符串,该属性需要一个 Type 对象。所以解决办法是……

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

        更新(针对问题#2 - 没有发生排序) 改编自来自this MSDN Page 的代码 sn-p(查看此处以了解辅助方法的实现)。 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
        

        【讨论】:

        • @vigna... 它对我有用。第二个 DataView 按日期的 Asc 顺序排序。将您的代码与上述代码进行比较并找出差异。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多