在ListView控件中显示年度总计

时间:2018-07-13 21:28:42

标签: c# winforms sql-server-2012-express

我正在测试一个示例应用程序,该应用程序添加了许多个人(即“人”),并记录了每个人(每年的“ minTime”)一年中每个月的时间量度(em>)。一个十进制值,“ auxTime”一个十进制值。

在我的代码中,我遍历SQL数据库表,以求合计每个人小时的十进制值。 “ person”是一个nvarchar,“ yearTotal”是一个小数。

我想在ListView屏幕中显示总计。

出于测试目的,我添加了2个人。每个人都有一个为每个12个月输入的时间量度。

我遇到了两个问题。

1)尝试将“ yearTotal”添加到ListView控件中,最终显示每个人的12个月数据中的每个月

例如:约翰·史密斯50小时,约翰·史密斯75小时,等等,而不是约翰·史密斯的总数,而这发生在所有人身上。

2)一旦“ yearTotal”达到第一个人的正确总数,它就会保留此值并为下一个人递增,为所有后续人提供错误的值。

我需要知道如何(以及在​​何处)将“每个人的年度总数”添加到ListView控件的“一个条目”中,而不是同一个人的多个条目中。

例如:约翰·史密斯840小时,萨莉·琼斯750小时。

这里是一个链接,用于下载带有名为“ timeRecord”的单个表的“ testDB”。 请记住,我需要一种方法来完全合计每个人的值,将一月到十二月的值相加,然后在ListView控件中显示该人的总计。

当我试图在minTime和auxTime列(使用别名)上使用SUM时,SQL仍然显示每个月的总计,但没有为每个人显示一个总计。 sample database

2 个答案:

答案 0 :(得分:0)

我不会解释,只是写完代码。

class String_String
{
    public _string1 { get; set; }
    public _string2 { get; set; }
}


try
{
    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TimeKeeping.mdf;Integrated Security=True;User Instance=False"))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(
        "SELECT people, SUM(minTime) FROM timeTable ASC GROUP BY PEOPLE ORDER BY people", conn))
        {
            SqlDataReader dr = cmd.ExecuteReader();

            List<String_String> list = new List<String_String>();

            while(dr.Read())
            {
                list.Add(new List<String_String> { _string1 = dr[0].ToString(), _string2 = dr[1].ToString() });
            }


            lstVwPeopleTime.DataSource = list;
            lstVwPeopleTime.DisplayMember = "_string2";
            lstVwPeopleTime.ValueMember = "_string1";
        }
    }
}
catch (SqlException ex) { MessageBox.Show(ex.Message); }
catch (System.Exception ex) { MessageBox.Show(ex.Message); }

代码未经测试,因此可能会导致错误。

答案 1 :(得分:0)

我终于弄清楚了如何解决我遇到的问题。 我创建了一个单独的方法,即private void GetTotals(string name),其中我传递了每个人的名字。我从表名中查询了人,minTime,auxTime,其中人= @person。然后在SQL数据读取器循环中,我增加minTime和auxTime值,并将这些值传递到ListViewItem以便在ListView控件中显示。

while (reader.Read())
{
    yearTotal += Convert.ToDecimal(reader["minTime"].ToString(), CultureInfo.InvariantCulture) + 0.00M;
    auxTotal += Convert.ToDecimal(reader["auxTime"].ToString(), CultureInfo.InvariantCulture) + 0.00M;
}
ListViewItem listItem = new ListViewItem(name);
listItem.SubItems.Add(yearTotal.ToString());
listItem.SubItems.Add(auxTotal.ToString());
lstVwPeopleTime.Items.Add(listItem);
name = "";
return;

在我以前的方法中,我只创建并实例化一个ArrayList,查询表中所有人员的姓名,然后将它们添加到ArrayList中。然后在foreach循环中,我将每个人的名字传递给GetTotals方法。此方法可以成功总计并在ListView控件中显示每个人的12个月值。