我正在测试一个示例应用程序,该应用程序添加了许多个人(即“人”),并记录了每个人(每年的“ 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
答案 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个月值。