在ListView控件中显示年度总计

问题描述 投票:1回答:2

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

在我的代码中,我遍历一个SQL数据库表,试图总计每个小时的小数值。 “person”是nvarchar,“yearTotal”是小数。

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

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

我遇到了两个问题。

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

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

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

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

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

这是一个下载“testDB”的链接,其中包含一个名为“timeRecord”的表。请记住,我需要一种方法来完全计算每个人的值,从1月到12月总计他们的值,并在ListView控件中显示该人的总计。

当我尝试在minTime和auxTime列上使用SUM(带别名)时,SQL仍会显示每个人的月份总数,但不会显示单个总计。 sample database

c# winforms sql-server-2012-express
2个回答
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); }

代码未经过测试,因此可能会出错。


0
投票

我终于弄清楚如何解决我遇到的问题。我创建了一个单独的方法,即private void GetTotals(字符串名称),其中我传递每个人的名字。我在tablename中查询了person,minTime,auxTime,其中person = @person。然后在SQL datareader循环中,我递增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个月值。

© www.soinside.com 2019 - 2024. All rights reserved.