如何更改 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 | |
+-------------+----------+------------+-------+-------+----------+
在上面的datatable
、WaitTime
和AssistTime
数据以双值形式出现,现在我需要将WaitTime
和AssistTime
列格式更改为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));]。 @jdwengWaitTime
和 AssistTime
在数据库中是十进制值。你能告诉我你的代码[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?
使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表
C#将datatable生成easyui的绑定tree 的json数据格式