获取C#中datagridview中每一行的时间跨度

时间:2017-08-09 14:53:15

标签: c# winforms datagridview

所以我做了一个小议程,我将待办事项列表插入到数据库中,并在我保存时将DataGridViewDateTime.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的每一行中的所有结果。那么如何将其转换为数组并获得每个结果呢?

3 个答案:

答案 0 :(得分:3)

首先,您需要为System.Linq添加使用:

using System.Linq;

然后你可以使用这个小片段:

IEnumerable<TimeSpan> timeSpans = dataGridView1.Rows.Select(row => (DateTime.Now - Convert.ToDateTime(row.Cells[2].Value));

您可以使用IEnumerable,例如在foreach循环中或将其转换为Arraytimespans.ToArray())或Listtimespans.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
        }
    }