用C#创建民意调查(窗体)

时间:2015-07-11 10:01:18

标签: c# winforms datagridview charts

我想创建一个民意调查。我有一个问题表(字段:ID,问题)和另一个答案(字段:ID,QuestionID,答案)。有一个结果表(字段:QuestionID,AnswerID,UserID)。我想显示响应datagridview中任何项目的百分比。 例如,当我输入问题ID时,datagridview显示:

选择问题ID:1

选项...........百分比

1 ------------------------- 30

2 -------------------------- 20

3 --------------------------- 50

4 -------------------------- 10

这是我的代码但是结果没有显示出来:

    int a = Convert.ToInt32(textBox1.Text);

        var q = (from s in Session.DB.PoolUsers
                 where s.PoolQID == a
                 select s);
        var qq = (from c in q
                  group c by c.PoolAID into agroups
                  select agroups.Key);
        var qqq = (from c in qq
                   select c).Count();
        MessageBox.Show(qqq.ToString());

还有我的课程:

    public partial class PoolA    //For answers
{
    public int Id { get; set; }
    public string Answer { get; set; }
    public string QuestionID { get; set; }
}

     public partial class PoolQ    //Questions
{
    public int Id { get; set; }
    public string Question { get; set; }
    public string AnswerID { get; set; }
    public string Status { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
}

     public partial class PoolUser  //resaults
{
    public int Id { get; set; }
    public int PoolQID { get; set; }
    public int PoolAID { get; set; }
    public int UserID { get; set; }
}

3 个答案:

答案 0 :(得分:0)

我不知道你的意图,但我认为你应该重新设计架构(不是因为它不可行)以获得最大效率。您将PoolUser表称为结果表,但它最好是您的答案日志。您需要一个已经处理过结果的表格,例如在DWH类型的情况下进行处理。

如果您有结果汇总表,您可以整天计算垂直汇总组,而无需为临时数据连接表等的额外性能。我认为你要经常运行这个结果,所以听起来最好存储报告,性能等的汇总信息。

关于问题的当前状态:

var qq = (from c in q
          group c by c.PoolAID into agroups
          select agroups.Key);

agroups的answerIds按您输入的问题编号分组。 然后你只是显示分组答案的行数,显示你2:

var qqq = (from c in qq
           select c).Count();
你告诉我你的消息框显示数字“2” 这意味着人们只选择了两个选项来回答您输入的任何问题ID。您不知道答案是否正确。你有最后一个查询“qqq”,你有外面的计数,所以它只返回行数。你不想要行数。你想要分组后的answerID计数。

from c in qq
select count(c)

这是您输入的questionID的总答案。

现在您需要正确的答案才能计算百分比。这是缺少的查询。你已经走了75%的路。完成它。希望这是足够的细节,而不是太多的文字阅读。

答案 1 :(得分:0)

这不是我做的最佳方式,我会高度考虑你,改变你的实体。

以下是解决方案:

int questionId = 1;
var questionAnswers = list.Where(elem => elem.PoolQID == questionId);
int questionAnswersCount = questionAnswers.Count();
var answersPrecentage = questionAnswers
                        .GroupBy(elem => elem.PoolAID)
                        .ToDictionary(grp => grp.Key, grp => (grp.Count() * 100.0 / questionAnswersCount));

.NET Fiddle Link

答案 2 :(得分:0)

问题解决了,我得到了以下代码。我还绘制了基于

的图表
       private void button1_Click(object sender, EventArgs e)
    {
        var list = (from c in Session.DB.PoolUsers
                 select c).ToList();
        int questionId = Convert.ToInt32(textBox1.Text);
        var questionAnswers = list.Where(elem => elem.PoolQID == questionId);
        int questionAnswersCount = questionAnswers.Count();
        var answersPrecentage = questionAnswers
                                .GroupBy(elem => elem.PoolAID)
                                .ToDictionary(grp => grp.Key, grp => (grp.Count() * 100.0 / questionAnswersCount));
        dataGridView1.DataSource = answersPrecentage.ToArray();


        //Draw Chart From DataGridview:
        chart1.DataBindTable(answersPrecentage);

    }

并且工作正常 谢谢大家:))