在C#(windows窗体)中创建轮询
我想创建一个投票。我有一个问题表(字段:ID,问题)和另一个答案表(字段:ID,问题ID,答案)。有一个结果表(字段:QuestionID、AnswerID、UserID)。我想显示对datagridview中任何项目的响应百分比。 例如,当我输入问题id时,datagridview显示: 选择问题ID:1 选项……….百分比 1------------------30 2------------------20 3-----------------50 4------------------10 这是我的代码,但结果没有显示:在C#(windows窗体)中创建轮询,c#,winforms,datagridview,charts,C#,Winforms,Datagridview,Charts,我想创建一个投票。我有一个问题表(字段:ID,问题)和另一个答案表(字段:ID,问题ID,答案)。有一个结果表(字段:QuestionID、AnswerID、UserID)。我想显示对datagridview中任何项目的响应百分比。 例如,当我输入问题id时,datagridview显示: 选择问题ID:1 选项……….百分比 1------------------30 2------------------20 3-----------------50 4------------------1
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; }
}
我不知道您的意图,但我认为您应该重新设计模式(不是说它不可行),以获得最大的效率。您将PoolUser表称为results表,但它充其量只是您的答案日志。您需要一个已经处理了结果的表,就像在DWH类型的情况下一样 如果你有一个结果汇总表,你可以整天计算垂直和组,而不需要额外的连接表等特殊数据的性能。我想你会经常运行这个来检查结果,所以听起来存储总结信息是一个更好的主意,用于报告、性能等 至于问题的现状:
var qq = (from c in q
group c by c.PoolAID into agroups
select agroups.Key);
agroups将答案按您键入的问题编号分组。
然后,您只需显示分组答案的行数,这显示了2:
var qqq = (from c in qq
select c).Count();
你是说你的信息框显示的是数字“2”
这意味着人们只选择了2个选项来回答你提出的任何问题。你不知道答案是否正确。最后一个查询“qqq”,您的计数在外面,因此它只返回行计数。您不需要行计数。您需要分组后的应答ID计数
from c in qq
select count(c)
这是您键入的问题ID的总答案
现在你需要正确的答案来计算百分比。这是缺少的查询。你已经走了75%的路。把它做完。希望这足够详细,没有太多的文本可以阅读。我不知道您的意图,但我认为您应该重新设计模式(不是说它不可行),以获得最大的效率。您将PoolUser表称为results表,但它充其量只是您的答案日志。您需要一个已经处理了结果的表,就像在DWH类型的情况下一样 如果你有一个结果汇总表,你可以整天计算垂直和组,而不需要额外的连接表等特殊数据的性能。我想你会经常运行这个来检查结果,所以听起来存储总结信息是一个更好的主意,用于报告、性能等 至于问题的现状:
var qq = (from c in q
group c by c.PoolAID into agroups
select agroups.Key);
agroups将答案按您键入的问题编号分组。
然后,您只需显示分组答案的行数,这显示了2:
var qqq = (from c in qq
select c).Count();
你是说你的信息框显示的是数字“2”
这意味着人们只选择了2个选项来回答你提出的任何问题。你不知道答案是否正确。最后一个查询“qqq”,您的计数在外面,因此它只返回行计数。您不需要行计数。您需要分组后的应答ID计数
from c in qq
select count(c)
这是您键入的问题ID的总答案
现在你需要正确的答案来计算百分比。这是缺少的查询。你已经走了75%的路。把它做完。希望这是足够的细节,而不是太多的文本要阅读。 < P>这不是我要做的最佳方式,我会高度考虑你,改变你的实体。 解决方案如下:
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));
< P>这不是我要做的最佳方式,我会高度考虑你,改变你的实体。 解决方案如下:
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));
问题解决了,我得到了以下代码。我还绘制了一个基于
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);
}
而且工作正常
谢谢大家:)问题解决了,我得到了以下代码。我还绘制了一个基于
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);
}
而且工作正常
谢谢大家:)您能发布相关实体(类)吗?您所说的结果不显示是什么意思?如何在gridview中看到百分比而不是代码;您发布的linq的预期结果是什么?只是总体上需要更多information@MutuYolbulan我手动显示重新结果,例如,代码在消息中仅显示“2”box@oreleraki这是我的实体,编辑你能发布相关的实体(类)吗?你说结果不显示是什么意思?如何在gridview中看到百分比而不是代码;您发布的linq的预期结果是什么?只是总体上需要更多information@MutuYolbulan我手动显示重新结果,例如,代码在消息中仅显示“2”box@oreleraki这是我的实体,编辑手稿,有用的。。。PoolUser是我的答案日志。但是我不知道如何计算每个问题答案的百分比。。。我想数一数对每个选项投票的成员,然后计算他们的百分比。这是真的吗?我该怎么做?据了解,选择的数量是无限的…谢谢,有用的。。。PoolUser是我的答案日志。但是我不知道如何计算每个问题答案的百分比。。。我想数一数对每个选项投票的成员,然后计算他们的百分比。这是真的吗?我该怎么做?根据这一点,选择的数量是无限的。。。