如何更改 DataTable C# 中的列格式

Posted

技术标签:

【中文标题】如何更改 DataTable C# 中的列格式【英文标题】:How to change column format in DataTable C# 【发布时间】:2020-04-22 20:55:32 【问题描述】:

在我的应用程序中返回以下数据表,

+-------------+----------+------------+-------+-------+----------+
| AccountName | WaitTime | AssistTime | FName | LName | FullName |
+-------------+----------+------------+-------+-------+----------+
| XXX         | 18       | 15         | Mary  | Sil   |          |
+-------------+----------+------------+-------+-------+----------+
| YYY         | 67       | 3          | Jany  | Joh   |          |
+-------------+----------+------------+-------+-------+----------+
| ZZZ         | 50       | 100        | Kate  | Ham   |          |
+-------------+----------+------------+-------+-------+----------+

在上面的datatableWaitTimeAssistTime数据以双值形式出现,现在我需要将WaitTimeAssistTime列格式更改为00:00:00 (hh:mm:ss)格式。所以我只写了以下代码(请注意这部分代码)。

DataTable tableone = ds.Tables[0];

tableone.Select().ToList().ForEach(row =>


    string FirstName = Convert.ToString(row["FName"], CultureInfo.InvariantCulture);
    string LastName = Convert.ToString(row["LName"], CultureInfo.InvariantCulture);
    double xxx = Convert.ToDouble(row["WaitTime"]);

    row.SetField("WaitTime",secondsToTime(xxx));
    row.SetField("FullName", string.Format("0 1", FirstName, LastName));
);

private string secondsToTime(double seconds)

    TimeSpan t = TimeSpan.FromSeconds(seconds);
    string answer = string.Format("0:D2:1:D2:2:D2",
        t.Hours,
        t.Minutes,
        t.Seconds);
    return answer;

但上面的代码给出了这个错误,

System.ArgumentException: '输入字符串不正确 格式。无法将 存储在 WaitTime 列中。预期类型是 十进制。 FormatException: 输入字符串的格式不正确。

我需要按照格式化的数据表。

+-------------+----------+------------+-------+-------+----------+
| AccountName | WaitTime | AssistTime | FName | LName | FullName |
+-------------+----------+------------+-------+-------+----------+
| XXX         | 00:00:18 | 00:00:15   | Mary  | Sil   | Mary Sil |
+-------------+----------+------------+-------+-------+----------+
| YYY         | 00:01:07 | 00:00:03   | Jany  | Joh   | Jany Joh |
+-------------+----------+------------+-------+-------+----------+
| ZZZ         | 00:00:50 | 00:01:40   | Kate  | Ham   | Kate Ham |
+-------------+----------+------------+-------+-------+----------+

我该怎么做?请帮忙

【问题讨论】:

数据库中的时间是什么类型?它是数字还是日期对象?看起来您的代码需要一个整数 [row.SetField("WaitTime",secondsToTime(xxx));]。 @jdweng WaitTimeAssistTime 在数据库中是十进制值。你能告诉我你的代码[row.SetField("WaitTime",secondsToTime(xxx));]和我的代码有什么区别吗:) 【参考方案1】:

您已成功更改 WaitTime 和 AssistTime 列中的值

现在只需按照以下步骤操作

        DataTable dtTemp = new DataTable();

        dtTemp = dtOri.Clone();
        dtTemp.Columns["WaitTime"].DataType = typeof(TimeSpan);
        dtTemp.Columns["AssistTime"].DataType = typeof(TimeSpan);
        //you can change data type to string as well if you need
        //if you are changing datatype to string make sure to add ".ToString()" in below code e.g secondsToTime(xx).ToString()

        foreach (DataRow row in dtOri.Rows)
        
            dtTemp.Rows.Add(new object[] row[0], secondsToTime(Convert.ToDouble(row[1].ToString())), secondsToTime(Convert.ToDouble(row[2].ToString())), row[3],row[4],row[5]);
        

        dtOri = dtTemp;

【讨论】:

【参考方案2】:

正如 Jeff 在他的回答中提到的,在 Datatable 中填充了数据后,您无法更改 DataType。您可以做的是,克隆数据表,更改列类型并将数据从原始数据表加载到克隆表中,如下所示。

DataTable dtCloned = tableone.Clone();
dtCloned.Columns[1].DataType = typeof(string); //In your case you need to change WaitTime and AssistTime
dtCloned.Columns[2].DataType = typeof(string);

foreach (DataRow row in tableone.Rows)

    dtCloned.ImportRow(row);

然后你可以使用你的代码,

dtCloned.Select().ToList().ForEach(row =>

    double xxx = Convert.ToDouble(row["WaitTime"]);
    row.SetField("WaitTime", secondsToTime(xxx));
);

【讨论】:

【参考方案3】:

WaitTime 列的类型是小数,因此您不能将其设置为 TimeSpan。填充后无法更改 DataTables 的列类型,因此您必须在源中更改它或创建一个克隆。

看到这个答案 https://***.com/a/9028087/1532710

【讨论】:

你能告诉我,我怎样才能使用克隆数据表做到这一点,请帮助我。实际上我不需要设置 TimeSpan。 secondsToTime 函数返回字符串值。你能不能给我一个完整的答案 对不起,我不明白你所说的克隆数据库是什么意思。 DataTable 是您的数据在内存中的 .Net 表示形式。您可以使用设计器在代码中手动定义一个,也可以让框架从您的数据源自动为您创建一个。其他答案显示了一种通过克隆和更改类型来自定义数据表的方法。您还可以更改根源(api 服务或数据库)的列类型。

以上是关于如何更改 DataTable C# 中的列格式的主要内容,如果未能解决你的问题,请参考以下文章

C# 问题:如何将在 DataGridView 中所做的更改保存回使用的 DataTable?

更改DataTable某列的值。C#

使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表

C#将datatable生成easyui的绑定tree 的json数据格式

c#如何把Json转成DataTable每一行都一一对应下面多出来的列自动添加到后方

Winforms C#:从远程计算机文件夹获取图像并加载到 DataTable 的列中