所以我做了一个小议程,我将待办事项列表插入到数据库中,并在我保存时将DataGridView
与DateTime.Now
一起填入。如果我忘记对该列表执行某些操作,它将显示通知并告诉我忘记这样做。
我想使用最长时间为TimeSpan
的{{1}},只会在通过2小时后显示通知。
这是我目前的代码:
private void GetSpan()
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
TimeSpan span = (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
String.Format("{0} hours, {1} minutes, {2} seconds",
span.Hours, span.Minutes, span.Seconds);
}
}
这段代码的问题在于它只给出了一个结果,而不是DataGridView
的每一行中的所有结果。那么如何将其转换为数组并获得每个结果呢?
答案 0 :(得分:3)
首先,您需要为System.Linq添加使用:
using System.Linq;
然后你可以使用这个小片段:
IEnumerable<TimeSpan> timeSpans = dataGridView1.Rows.Select(row => (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
您可以使用IEnumerable,例如在foreach循环中或将其转换为Array(timespans.ToArray()
)或List(timespans.ToList()
)。
您的方法可能如下所示:
private IEnumerable<TimeSpan> GetSpans()
=> dataGridView1.Rows.Select(row => (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
或者像这样:
private IEnumerable<TimeSpan> GetSpans()
{
dataGridView1.Rows.Select(row => (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
}
你可以像这样使用它:
foreach (TimeSpan span in this.GetSpans())
{
string formattedTimeSpan = String.Format("{0} hours, {1} minutes, {2} seconds",
span.Hours, span.Minutes, span.Seconds);
doSomething(formattedTimeSpan);
}
答案 1 :(得分:2)
当您正在寻找使用数组的正确轨道时,List
将完成同样的事情,并且更容易使用。
private List<String> GetSpans()
{
var timeSpanList = new List<string>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
TimeSpan span = (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
timeSpanList.Add(String.Format("{0} hours, {1} minutes, {2} seconds",
span.Hours, span.Minutes, span.Seconds));
}
return timeSpanList;
}
这将为您提供一个TimeSpans的完整列表,一个用于数据网格中的每一行。根据您的应用程序,您可能希望返回List<TimeSpan>
而不是格式化字符串列表,但这取决于您。
或者,另一个可能对您有帮助的有用集合类型是Dictionary
。如果每行都有唯一的ID,则可以将此函数的结果存储在Dictionary而不是List中;这样,您可以稍后通过该行的ID快速查找任何给定行的TimeSpan。
FMI:
答案 2 :(得分:1)
我建议创建一个包含所有时间跨度的列表,这样您就可以迭代或选择(使用linq)您希望拥有的所有项目。
// Make returnvalue list of timespans
private List<TimeSpan> GetSpan()
{
List<TimeSpan> allSpans = new List<TimeSpan>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
TimeSpan span = (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));
String.Format("{0} hours, {1} minutes, {2} seconds",
span.Hours, span.Minutes, span.Seconds);
// Add timespans to list
allSpans.Add(span);
}
// return list
return allSpans;
}
现在,您可以通过调用
遍历另一个函数中的列表 private void Form1_Load(object sender, EventArgs e)
{
foreach(var time in GetSpan())
{
// doSomething with time
}
}