簡體   English   中英

獲取C#中datagridview中每一行的時間跨度

[英]Get timespan of every row in datagridview in C#

所以我做了一個小議程,我將待辦事項列表插入到數據庫中,並在保存時將其與DateTime.Now一起填充到DataGridView 如果我忘記對該列表執行某些操作,它將顯示通知並告訴我忘記這樣做。

我想使用最多幾小時的TimeSpan ,只有通過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每一行都給出了所有結果。 那么如何將其轉換為數組並獲得每個結果呢?

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

using System.Linq;

然后你可以使用這個小片段:

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

您可以在foreach -loop中使用IEnumerable或將其轉換為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);
}

當你正在尋找使用數組的正確軌道時, 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中; 這會讓你快速查看任何給定行的TimeSpan稍后的行ID。

FMI:

我建議創建一個包含所有時間跨度的列表,這樣您就可以迭代或選擇(使用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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM