/*------------------------------------------------------------------------------------------- * 个人排行榜 * 创建:杨斌 2011-12-01 * 修改:杨斌 2012-01-21 * ----------------------------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using GeneralLib; using Microsoft.Office.Interop.PowerPoint; using DataTable = System.Data.DataTable; namespace SunVoteARSPPT { public partial class FrmRankGroup : Form { /// /// 是否正在加载窗体 /// private bool IsLoading = false; public FrmRankGroup() { InitializeComponent(); } /// /// 初始化图表排行榜数据 /// 杨斌 2014-08-06 /// /// /// /// public FrmRankGroup(int mode, string showCol, int count, Slide sld) { InitializeComponent(); IsInitChart = true; RankMode = mode; RankShowCol = showCol; RankCount = count; NowSlide = sld; } /// /// 初始化图表排行榜数据 /// 杨斌 2015-06-10 /// /// /// /// /// /// public FrmRankGroup(int mode, string showCol, int count, bool isGroupMVP, Slide sld) { InitializeComponent(); IsInitChart = true; RankMode = mode; RankShowCol = showCol; RankCount = count; NowSlide = sld; IsGroupMVP = isGroupMVP; } private bool IsInitChart = false; private int RankMode = 0; private string RankShowCol = ""; private int RankCount = 0; private Slide NowSlide = null; private bool IsGroupMVP = false; //退出 private void btnClose_Click(object sender, EventArgs e) { this.Close(); } /// /// 导出报表 /// /// /// private void btnExport_Click(object sender, EventArgs e) { ExportRank(); } /// /// 全屏显示 /// /// /// private void btnShowFull_Click(object sender, EventArgs e) { FrmRank frmRank = new FrmRank(this.dgvRank); //杨斌 2015-12-02 Form FDialogParent = Globals.SunVoteARSAddIn.frmVoteBar.FDialog; Globals.SunVoteARSAddIn.frmVoteBar.FDialog = frmRank; frmRank.WindowState = FormWindowState.Maximized; frmRank.ShowDialog(); Globals.SunVoteARSAddIn.frmVoteBar.FDialog = FDialogParent;//杨斌 2015-12-02 } /// /// 人员名单类 /// private RosterList Roster = new RosterList(); /// /// 窗体加载 /// /// /// private void FrmRankGroup_Load(object sender, EventArgs e) { IsLoading = true; if (IsInitChart) { this.Hide(); this.ShowInTaskbar = false; } ResponseDB.UpdateSlideIndexToDB(); GlobalInfo.SysLanguage.SetLanguage(this.Name, this); chkSelectAllSlide.Text = ""; lvwSlide.Columns[0].Text = "";//杨斌 2012-03-26 Roster.LoadRoster(); ControlOper.SetPosCheckBoxToListViewHead(lvwSlide, chkSelectAllSlide);//杨斌 2012-11-16 LoadSlide(); LoadGroupType(); LoadGroupItem(); LoadSortField(); //杨斌 2014-08-06 InitRankChart(); //ShowRankGroup();//杨斌 2014-08-06 chkBySpeed.Checked = false;//杨斌 2014-07-25 //IsLoading = false;//杨斌 2014-08-06 //杨斌 2014-07-25 List lstRadio = new List(); lstRadio.Add(GlobalInfo.IniCtlSystem.ReadString(this.Name, "OrderField", "")); if (GlobalInfo.IniCtlSystem.ReadInt(this.Name, chkBySpeed.Name, 0) == 1) lstRadio.Add(chkBySpeed.Name); ControlOper.SetControlCheck(this, lstRadio); //杨斌 2015-03-13 if (IsInitChart) { rbtByScore.Checked = true; } ShowRankGroup(); IsLoading = false; } public List GetRankGroupMVData() { List res = new List(); int colScore = dgvRank.Columns.Count - 1; if (dgvRank.Columns.Contains("Score")) colScore = dgvRank.Columns["Score"].Index; for (int i = 0; i < dgvRank.Rows.Count; i++) { if (res.Count >= RankCount) break; RankGroupMVPData item = new RankGroupMVPData(); item.rank = ConvertOper.Convert(dgvRank.Rows[i].Cells[0].Value.ToString()).ToInt; item.group = dgvRank.Rows[i].Cells[1].Value.ToString(); if (cboGroupType.SelectedIndex >= 0)//杨斌 2015-08-10 { if (dgvRank.Rows[i].Cells[2].Value != null)//杨斌 2015-08-10 item.name = dgvRank.Rows[i].Cells[2].Value.ToString(); else item.name = ""; } else item.name = (i + 1).ToString(); item.score = ConvertOper.Convert(dgvRank.Rows[i].Cells[colScore].Value.ToString()).ToDouble; res.Add(item); } return res; } /// /// 获取图表名次数据 /// 杨斌 2014-08-07 /// 杨斌 2015-03-06 /// /// public List GetRankChartData() { List res = new List(); int colScore = dgvRank.Columns.Count - 1; if (dgvRank.Columns.Contains("Score")) colScore = dgvRank.Columns["Score"].Index; for (int i = 0; i < dgvRank.Rows.Count; i++) { if (res.Count >= RankCount) break; RankChartData item = new RankChartData(); item.rank = ConvertOper.Convert(dgvRank.Rows[i].Cells[0].Value.ToString()).ToInt; //杨斌 2014-12-01 if (cboGroupType.SelectedIndex >= 0) item.name = dgvRank.Rows[i].Cells[1].Value.ToString(); else item.name = (i + 1).ToString(); item.score = ConvertOper.Convert(dgvRank.Rows[i].Cells[colScore].Value.ToString()).ToDouble; res.Add(item); } return res; } /// /// 初始化排行图表数据 /// 杨斌 2014-08-06 /// private void InitRankChart() { if (!IsInitChart) return; Presentation pres = NowSlide.Parent as Presentation; List lstSlideID = new List(); for (int i = 1; i <= NowSlide.SlideIndex; i++) { lstSlideID.Add("'" + pres.Slides[i].SlideID + "'"); } int count = 0; if (RankMode == 1) { for (int i = lvwSlide.Items.Count - 1; i >= 0; i--) { //if (count >= RankCount) break; string id = lvwSlide.Items[i].Tag.ToString(); if ((lstSlideID.Contains(id)) && (count < 1)) { lvwSlide.Items[i].Checked = true; count++; } else lvwSlide.Items[i].Checked = false; } } else if (RankMode == 2) { TagSet tagSet = new TagSet(NowSlide.Tags); string s = tagSet.LoadValue(TagKey.RankChartSetSlide, "").Value; List lst = new List(); if (s.Length > 0) { string[] ary = s.Split(new char[] { ',' }); lst = ary.ToList(); } for (int i = 0; i < lvwSlide.Items.Count; i++) { //if (count >= RankCount) break; string id = lvwSlide.Items[i].Tag.ToString(); id = id.Replace("'", ""); lvwSlide.Items[i].Checked = (lst.Contains(id)); } } else { for (int i = 0; i < lvwSlide.Items.Count; i++) { //if (count >= RankCount) break; string id = lvwSlide.Items[i].Tag.ToString(); if (lstSlideID.Contains(id)) { lvwSlide.Items[i].Checked = true; count++; } else lvwSlide.Items[i].Checked = false; } } cboGroupType.SelectedIndex = -1;//杨斌 2014-11-06 for (int i = 0; i < cboGroupType.Items.Count; i++) { if (cboGroupType.Items[i].ToString() == RankShowCol) { cboGroupType.SelectedIndex = i; break; } } chkBySpeed.Checked = false; rbtByScore.Checked = true; } /// /// 查询的反馈题目类型 /// private const string cResponseType = "'Choice','Judge','Order','Number','Text'";//杨斌 2012-03-16 /// /// 加载反馈幻灯片信息 /// private void LoadSlide() { try { lvwSlide.Items.Clear(); //加载数据 string sql = "Select * From ST_Topic WHERE (((ST_Topic.TT_ID) IN(" + cResponseType + "))) Order By T_Index Asc"; GlobalInfo.DBOperation.OpenDataSet(sql); DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; ListViewItem item = lvwSlide.Items.Add(row["T_Index"].ToString()); item.SubItems.Add(row["T_Title"].ToString()); item.Tag = "'" + row["T_ID"].ToString() + "'";//存放题目ID } GlobalInfo.DBOperation.CloseDataSet(); //全选 chkSelectAllSlide.Checked = (lvwSlide.Items.Count > 0); ControlOper.SelectAllListViewItem(lvwSlide, chkSelectAllSlide.Checked); } catch (Exception ex) { SystemLog.WriterLog(ex); } } private class GroupInfo { /// /// 分组类型,0=名单,1=反馈 /// public int type = 0; /// /// 搜索的关键字,名单=RC_ID,反馈=T_ID /// public string searchId = ""; } /// /// 分组信息列表 /// private List ListGroupInfo = new List(); /// /// 加载名单字段 /// private void LoadGroupType() { try { cboGroupType.Items.Clear(); //加载名单字段 if (GlobalInfo.response.EnableList) { //cboGroupType.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "cboGroupType", "键盘型号")); for (int i = 1; i < Roster.Columns.Count; i++) { cboGroupType.Items.Add(Roster.Columns[i].ColumnName); GroupInfo info = new GroupInfo(); info.type = 0; info.searchId = Roster.Columns[i].ColumnID.ToString(); ListGroupInfo.Add(info); } } //加载分组反馈 string sql = "Select * From ST_Topic WHERE (((ST_Topic.TT_ID) IN('Group')) And (len(T_ID)<12)) Order By T_Index Asc"; GlobalInfo.DBOperation.OpenDataSet(sql); DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; cboGroupType.Items.Add(row["T_Name"].ToString()); GroupInfo info = new GroupInfo(); info.type = 1; info.searchId = row["T_ID"].ToString(); ListGroupInfo.Add(info); } GlobalInfo.DBOperation.CloseDataSet(); //选中默认字段-键盘编号 if (cboGroupType.Items.Count > 0) cboGroupType.SelectedIndex = 0; } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 加载分组选项 /// private void LoadGroupItem() { try { clbGroupItem.Items.Clear(); if (cboGroupType.SelectedIndex < 0) return; string sql = ""; DataTable tb = null; GroupInfo info = ListGroupInfo[cboGroupType.SelectedIndex]; if (info.type == 0) { sql = "SELECT Distinct ST_RosterValue.RV_Text" + " FROM ST_RosterValue" + " WHERE (((ST_RosterValue.RC_ID)=" + info.searchId + "))" + " ORDER BY ST_RosterValue.RV_Text Asc"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; clbGroupItem.Items.Add(row["RV_Text"].ToString()); } GlobalInfo.DBOperation.CloseDataSet(); } else { sql = "SELECT ST_TopicPar.TP_Value" + " FROM ST_TopicPar" + " WHERE (((ST_TopicPar.T_ID)='" + info.searchId + "') AND ((ST_TopicPar.TP_Name)='OptionCount'))"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; int optionCount = 0; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; optionCount = ConvertOper.Convert(row["TP_Value"].ToString()).ToInt; } GlobalInfo.DBOperation.CloseDataSet(); if (optionCount > 0) { sql = "SELECT ST_TopicPar.TP_Name, ST_TopicPar.TP_Value" + " FROM ST_TopicPar" + " WHERE (((ST_TopicPar.T_ID)='" + info.searchId + "'))" + " ORDER BY ST_TopicPar.TP_Name"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; //修正分组排行的组名排序问题,TP_Name是按字符串排序的。杨斌 2018-03-15 Dictionary dicGroupName = new Dictionary(); for (int i = 1; i <= optionCount; i++) { dicGroupName.Add("OptionText_" + i, null); } for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string name = row["TP_Name"].ToString(); if (dicGroupName.ContainsKey(name)) dicGroupName[name] = row["TP_Value"].ToString(); //if (name.Contains("OptionText_")) //{ // clbGroupItem.Items.Add(row["TP_Value"].ToString()); //} } foreach (var v in dicGroupName) { if (v.Value != null) clbGroupItem.Items.Add(v.Value); } GlobalInfo.DBOperation.CloseDataSet(); } } //全选 ControlOper.SelectAllCheckListBox(clbGroupItem, true); chkSelectAllGroupItem.Checked = ((clbGroupItem.Items.Count > 0) && (clbGroupItem.CheckedItems.Count == clbGroupItem.Items.Count)); } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 加载名单字段 /// private void LoadRosterField() { try { cboRosterField.Items.Clear(); //加载名单字段 cboRosterField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "cboRosterField", "键盘型号")); for (int i = 1; i < Roster.Columns.Count; i++) { cboRosterField.Items.Add(Roster.Columns[i].ColumnName); } //选中默认字段-键盘编号 cboRosterField.SelectedIndex = 0; } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 加载排序字段 /// private void LoadSortField() { clbSortField.Items.Clear(); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvScore", "平均得分")); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvCorrect", "平均答对题数")); //clbSortField.Items.Add("平均正确率"); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_AgvSpeed", "平均答题速度")); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalScore", "总得分")); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalCorrect", "总答对题数")); //clbSortField.Items.Add("总正确率"); clbSortField.Items.Add(GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "clbSortField_TotalSpeed", "总答题速度")); //选中默认字段-得分 clbSortField.SetItemChecked(0, true); } /// /// 评分排行数据结构 /// 创建:杨斌 2012-03-19 /// 修改:杨斌 2012-06-12 /// public class GroupRankData { public string group = "";//名单分组为字段值,反馈分组为选项内容 public int groupNo = 0;//若反馈分组,为题目选项序号 public double[] aryScore = null;//用来排序的数据,多列排序按优先级:得分/答对,速度 public double score = 0; public double correctCount = 0; public double correctRate = 0; public double speed = 0; public int groupCount = 0;//分组人数 public int rankNo; public string vid = "";//名单id,杨斌 2015-06-11 public string keyId = "";//杨斌 2015-08-10 } /// /// 自定义排序分组排行榜过程 /// 创建:杨斌 2012-03-21 /// /// /// /// private int CompareScoreRank(GroupRankData x, GroupRankData y) { int res = 0; if (x.group.CompareTo(y.group) > 0) res = 1; if (x.group.CompareTo(y.group) < 0) res = -1; if (x.groupNo > y.groupNo) res = 1; if (x.groupNo < y.groupNo) res = -1; if (chkBySpeed.Checked)//杨斌 2018-03-15 { if (x.speed > y.speed) res = 1; if (x.speed < y.speed) res = -1; } for (int i = x.aryScore.Length - 1; i >= 0; i--) { if (x.aryScore[i] < y.aryScore[i]) res = 1; if (x.aryScore[i] > y.aryScore[i]) res = -1; } return res; } /// /// 获取名单分组人数 /// 创建:杨斌 2012-03-23 /// /// public static TDictionary GetRosterGroupCount() { TDictionary res = new TDictionary(); try { string sql = "SELECT ST_RosterValue.RV_Text, Count(ST_RosterValue.RR_ID) AS RR_IDCount" + " FROM ST_RosterColumn INNER JOIN ST_RosterValue ON ST_RosterColumn.RC_ID = ST_RosterValue.RC_ID" + " WHERE (((ST_RosterColumn.RC_ID)=30))" + " GROUP BY ST_RosterValue.RV_Text"; GlobalInfo.DBOperation.OpenDataSet(sql); DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string group = row["RV_Text"].ToString(); int count = ConvertOper.Convert(row["RR_IDCount"].ToString()).ToInt; if (!res.Contains(group)) res.Add(group, count); } GlobalInfo.DBOperation.CloseDataSet(); } catch (Exception ex) { SystemLog.WriterLog(ex); } return res; } /// /// 排行榜查询-小组成绩 /// 修改:杨斌 2012-06-12 /// private void ShowRankGroup() { try { dgvRank.Rows.Clear(); dgvRank.Columns.Clear(); dgvRank.Columns.Add("RankNo", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_0", "名次")); if (cboGroupType.Text.Length > 0) dgvRank.Columns.Add("RankName", cboGroupType.Text); else dgvRank.Columns.Add("RankName", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_1", "分组名称")); if (IsGroupMVP)//杨斌 2015-06-10 { if (cboGroupType.Items.Count >= 1) dgvRank.Columns.Add("RosterName", cboGroupType.Items[0].ToString()); } if (rbtByScore.Checked) dgvRank.Columns.Add("Score", rbtByScore.Text); if (rbtByCorrectRate.Checked) dgvRank.Columns.Add("CorrectRate", rbtByCorrectRate.Text); if (rbtByCorrectCount.Checked) dgvRank.Columns.Add("CorrectCount", rbtByCorrectCount.Text); if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02 dgvRank.Columns.Add("CorrectCountSum", rbtByCorrectCountSum.Text); if (chkBySpeed.Checked) dgvRank.Columns.Add("Speed", chkBySpeed.Text); ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应 if (lvwSlide.CheckedItems.Count < 1) return; if (cboGroupType.SelectedIndex < 0) return; if (clbGroupItem.CheckedItems.Count < 1) return; dgvRank.Visible = false; string sql = ""; DataTable tb = null; //加载反馈人员的所属分组 TDictionary dicVoterGroup = new TDictionary(); GroupInfo info = ListGroupInfo[cboGroupType.SelectedIndex]; if (info.type == 0) { sql = "SELECT ST_Voter.V_ID, ST_RosterValue.RV_Text" + " FROM ST_RosterColumn INNER JOIN (ST_Voter INNER JOIN ST_RosterValue ON ST_Voter.RR_ID = ST_RosterValue.RR_ID) ON ST_RosterColumn.RC_ID = ST_RosterValue.RC_ID" + " WHERE (((ST_RosterColumn.RC_ID)=" + info.searchId + "))"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string vid = row["V_ID"].ToString(); string group = row["RV_Text"].ToString(); dicVoterGroup.Add(vid, group); } GlobalInfo.DBOperation.CloseDataSet(); } else { sql = "SELECT ST_Response.V_ID, ST_Response.R_Result" + " FROM ST_Response" + " WHERE (((ST_Response.T_ID)='" + info.searchId + "'))"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string vid = row["V_ID"].ToString(); string group = row["R_Result"].ToString(); int i = group.IndexOf(","); if (i >= 0) { group = group.Substring(0, i); int index = ConvertOper.Convert(group).ToInt - 1; group = this.clbGroupItem.Items[index].ToString(); } dicVoterGroup.Add(vid, group); } GlobalInfo.DBOperation.CloseDataSet(); } //题目筛选 string topicID = ""; string[] aryTopic = new string[lvwSlide.CheckedItems.Count]; for (int i = 0; i < lvwSlide.CheckedItems.Count; i++) { aryTopic[i] = lvwSlide.CheckedItems[i].Tag.ToString(); } topicID = string.Join(",", aryTopic); //加载反馈人员的得分数据 TDictionary dicVoterScore = new TDictionary(); //杨斌 2015-08-10 sql = "SELECT ST_Response.V_ID, Sum(ST_Response.R_Score) AS R_ScoreSum, Sum(ST_Response.R_Correct) AS R_CorrectSum, Sum(ST_Response.R_Speed) AS R_SpeedSum" + " FROM ST_Response" + " WHERE (((ST_Response.T_ID) In (" + topicID + ")))" + " GROUP BY ST_Response.V_ID"; Dictionary dicVidToKeyId = new Dictionary(); GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string vid = row["V_ID"].ToString(); double scroe = ConvertOper.Convert(row["R_ScoreSum"].ToString()).ToDouble; double correct = ConvertOper.Convert(row["R_CorrectSum"].ToString()).ToDouble; double speed = ConvertOper.Convert(row["R_SpeedSum"].ToString()).ToDouble; dicVoterScore.Add(vid, new double[] { scroe, correct, speed }); ////杨斌 2015-08-10 //string keyId = row["R_KeypadID"].ToString(); //if (!dicVidToKeyId.ContainsKey(vid)) // dicVidToKeyId.Add(vid, keyId); } GlobalInfo.DBOperation.CloseDataSet(); //杨斌 2015-08-11 sql = "SELECT ST_Response.V_ID, ST_Response.R_KeypadID FROM ST_Response" + " WHERE (((ST_Response.T_ID) In (" + topicID + ")))"; GlobalInfo.DBOperation.OpenDataSet(sql); tb = GlobalInfo.DBOperation.DataSet.Tables[0]; for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; string vid = row["V_ID"].ToString(); string keyId = row["R_KeypadID"].ToString(); if (!dicVidToKeyId.ContainsKey(vid)) dicVidToKeyId.Add(vid, keyId); } GlobalInfo.DBOperation.CloseDataSet(); //加载成绩数据 TDictionary dicRank = new TDictionary(); foreach (string vid in dicVoterGroup.Keys) { string group = dicVoterGroup[vid]; GroupRankData data = null; if (clbGroupItem.CheckedItems.Contains(group)) { if (!dicRank.Contains(group)) { data = new GroupRankData(); dicRank.Add(group, data); data.group = group; data.aryScore = new double[1]; data.groupCount = 1; } else { data = dicRank[group]; data.groupCount++; } data.groupNo = clbGroupItem.CheckedItems.IndexOf(group) + 1;//杨斌 2018-03-15 if (dicVoterScore.Contains(vid)) { if (IsGroupMVP) { double score = dicVoterScore[vid][0]; double speed = dicVoterScore[vid][2]; if ((data.score < score) || ((data.score == score) && (data.speed > speed))) { data.vid = vid; data.score = score; data.speed = speed; data.correctCount = dicVoterScore[vid][1]; data.correctRate = dicVoterScore[vid][1]; } //if (data.score < score) //{ // data.score = score; // //杨斌 2015-08-11 // if (data.correctCount < dicVoterScore[vid][1]) // data.correctCount = dicVoterScore[vid][1]; // if (data.correctRate < dicVoterScore[vid][1]) // data.correctRate = dicVoterScore[vid][1]; // if (data.speed > dicVoterScore[vid][2]) // data.speed = dicVoterScore[vid][2]; //} } else { data.score += dicVoterScore[vid][0]; data.correctCount += dicVoterScore[vid][1]; data.correctRate += dicVoterScore[vid][1]; data.speed += dicVoterScore[vid][2]; } //data.correctCount += dicVoterScore[vid][1]; //data.correctRate += dicVoterScore[vid][1]; //data.speed += dicVoterScore[vid][2]; if (rbtByScore.Checked) { data.aryScore[0] = data.score; } else if (rbtByCorrectCount.Checked) { data.aryScore[0] = data.correctCount; } else if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02 { data.aryScore[0] = data.correctCount; } else if (rbtByCorrectRate.Checked) { data.aryScore[0] = data.correctRate; } } } } if (info.type == 0)//加载名单分组人数 { TDictionary dicGroupCount = GetRosterGroupCount(); for (int i = 0; i < dicRank.Count; i++) { GroupRankData data = dicRank[i]; if (dicGroupCount.Contains(data.group)) data.groupCount = dicGroupCount[data.group]; } } if (IsGroupMVP)//杨斌 2015-06-10 { for (int i = 0; i < dicRank.Count; i++) { dicRank[i].groupCount = 1; } } //排序 List lstRank = new List(); for (int i = 0; i < dicRank.Count; i++) { if (rbtByScore.Checked)//小组得分是平均分。杨斌 2013-05-15 { dicRank[i].score = dicRank[i].score / dicRank[i].groupCount; dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15 dicRank[i].aryScore[0] = dicRank[i].score; } else if (rbtByCorrectRate.Checked) { dicRank[i].correctRate = dicRank[i].correctRate / dicRank[i].groupCount;//答对总题数/分组人数=平均答对题数 dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15 dicRank[i].aryScore[0] = dicRank[i].correctRate; } else if (rbtByCorrectCount.Checked) { dicRank[i].correctCount = dicRank[i].correctCount / dicRank[i].groupCount;//答对总题数/分组人数=平均答对题数 dicRank[i].speed = dicRank[i].speed / dicRank[i].groupCount;//杨斌 2013-05-15 dicRank[i].aryScore[0] = dicRank[i].correctCount; } else if (rbtByCorrectCountSum.Checked)//杨斌 2013-04-02 { dicRank[i].correctCount = dicRank[i].correctCount;//答对总题数 dicRank[i].aryScore[0] = dicRank[i].correctCount; } lstRank.Add(dicRank[i]); } if (IsGroupMVP)//杨斌 2015-06-10。去掉0分数 { for (int i = lstRank.Count - 1; i >= 0; i--) { if (lstRank[i].score <= 0) lstRank.RemoveAt(i); } //杨斌 2015-08-11。下面块去掉 /* if (dicVoterGroup.Count > 0) { Dictionary dicRank2 = new Dictionary(); string[] aryVid = new string[dicVoterGroup.Count]; dicVoterGroup.Keys.CopyTo(aryVid, 0); for (int i = 0; i < lstRank.Count; i++) { for (int n = 0; n < dicVoterGroup.Count; n++) { if (dicVoterGroup[n] == lstRank[i].group) { string vid = aryVid[n]; if ((dicVoterScore.Contains(vid)) && (dicVoterScore[vid][0] == lstRank[i].score)) { if (!dicRank2.ContainsKey(vid)) { GroupRankData da = new GroupRankData(); da.vid = vid; da.aryScore = lstRank[i].aryScore; da.group = lstRank[i].group; da.score = lstRank[i].score; da.speed = lstRank[i].speed;//杨斌 2015-08-10 dicRank2.Add(vid, da); } //if (string.IsNullOrEmpty(lstRank[i].vid)) // lstRank[i].vid = vid; //else //{ // int m = i + 1; // if (m > lstRank.Count - 1) // { // lstRank.Add(lstRank[i]); // } // else // { // lstRank.Insert(m, lstRank[i]); // } // lstRank[m].vid = vid; // i++; //} } } } } lstRank = dicRank2.Values.ToList(); } * */ } lstRank.Sort(CompareScoreRank); //去掉同组非最高的。杨斌 2015-08-10 Dictionary dicGroupTop = new Dictionary(); foreach (var v in lstRank) { if (!dicGroupTop.ContainsKey(v.group)) dicGroupTop.Add(v.group, v); } lstRank = dicGroupTop.Values.ToList(); //int countTopic = lvwSlide.CheckedItems.Count; double countTopic = ResponseDB.GetSelItemAndHaveCorrect(lvwSlide); int rankNo = 1;//排名 for (int i = 0; i < lstRank.Count; i++) { if (i > 0) { for (int j = 0; j < lstRank[i].aryScore.Length; j++) { if (lstRank[i].aryScore[j] != lstRank[i - 1].aryScore[j]) rankNo = i + 1; } if (chkBySpeed.Checked)//杨斌 2014-11-05 { if (lstRank[i].speed != lstRank[i - 1].speed) rankNo = i + 1; } } lstRank[i].rankNo = rankNo; dgvRank.Rows.Add(); dgvRank.Rows[i].Cells["RankNo"].Value = rankNo; dgvRank.Rows[i].Cells["RankName"].Value = lstRank[i].group; if (dgvRank.Columns.Contains("Score")) { dgvRank.Rows[i].Cells["Score"].Value = lstRank[i].score; } if (dgvRank.Columns.Contains("CorrectCount")) { dgvRank.Rows[i].Cells["CorrectCount"].Value = ConvertOper.Round45(lstRank[i].correctCount, 2);//杨斌 2013-04-02 } if (dgvRank.Columns.Contains("CorrectCountSum"))//杨斌 2013-04-02 { dgvRank.Rows[i].Cells["CorrectCountSum"].Value = lstRank[i].correctCount; } if (dgvRank.Columns.Contains("CorrectRate")) { dgvRank.Rows[i].Cells["CorrectRate"].Value = ConvertOper.GetPercent(lstRank[i].correctRate, countTopic, 2); } if (dgvRank.Columns.Contains("Speed")) { dgvRank.Rows[i].Cells["Speed"].Value = lstRank[i].speed; } if (dgvRank.Columns.Contains("RosterName"))//杨斌 2015-06-11 { RosterRow row = Roster.GetRowByVoterID(lstRank[i].vid);//杨斌 2015-08-10 if (Roster.RosterEnabled) { if (row != null) { string rsName = row.Cells[1]; dgvRank.Rows[i].Cells["RosterName"].Value = rsName; } } else { if (dicVidToKeyId.ContainsKey((lstRank[i].vid))) dgvRank.Rows[i].Cells["RosterName"].Value = dicVidToKeyId[lstRank[i].vid]; else dgvRank.Rows[i].Cells["RosterName"].Value = row.Cells[0]; } } } ControlOper.SetGridRowH(dgvRank);//杨斌 2016-03-04 } catch (Exception ex) { SystemLog.WriterLog(ex); } ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应 dgvRank.Visible = true; } /// /// 排行榜查询-小组成绩 /// private void ShowRankGroupOld() { dgvRank.Visible = false; try { dgvRank.Rows.Clear(); dgvRank.Columns.Clear(); //名次 dgvRank.Columns.Add("RankSort", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_0", "名次")); //分组 if (cboRosterField.SelectedIndex >= 0) { dgvRank.Columns.Add("GroupValue", Roster.Columns[cboRosterField.SelectedIndex].ColumnName); dgvRank.Columns.Add("GroupCount", GlobalInfo.SysLanguage.LPT.ReadString(this.Name, "dgvRank_1", "分组人数")); } //成绩 TDictionary DicSortField = new TDictionary(); const string cScoreSumAvg = "R_ScoreSumAvg"; const string cCorrectSumAvg = "R_CorrectSumAvg"; const string cSpeedSumAvg = "R_SpeedSumAvg"; const string cScoreSumSum = "R_ScoreSumSum"; const string cCorrectSumSum = "R_CorrectSumSum"; const string cSpeedSumSum = "R_SpeedSumSum"; if (clbSortField.CheckedItems.Count > 0) { if (clbSortField.GetItemChecked(0)) { dgvRank.Columns.Add(cScoreSumAvg, clbSortField.Items[0].ToString()); DicSortField.Add(cScoreSumAvg, "Avg(RankVoter.R_ScoreSum)"); } if (clbSortField.GetItemChecked(1)) { dgvRank.Columns.Add(cCorrectSumAvg, clbSortField.Items[1].ToString()); DicSortField.Add(cCorrectSumAvg, "Avg(RankVoter.R_CorrectSum)"); } if (clbSortField.GetItemChecked(2)) { dgvRank.Columns.Add(cSpeedSumAvg, clbSortField.Items[2].ToString()); DicSortField.Add(cSpeedSumAvg, "Avg(RankVoter.R_SpeedSum)"); } if (clbSortField.GetItemChecked(3)) { dgvRank.Columns.Add(cScoreSumSum, clbSortField.Items[3].ToString()); DicSortField.Add(cScoreSumSum, "Sum(RankVoter.R_ScoreSum)"); } if (clbSortField.GetItemChecked(4)) { dgvRank.Columns.Add(cCorrectSumSum, clbSortField.Items[4].ToString()); DicSortField.Add(cCorrectSumSum, "Sum(RankVoter.R_CorrectSum)"); } if (clbSortField.GetItemChecked(5)) { dgvRank.Columns.Add(cSpeedSumSum, clbSortField.Items[5].ToString()); DicSortField.Add(cSpeedSumSum, "Sum(RankVoter.R_SpeedSum)"); } } //加载数据 if ((lvwSlide.CheckedItems.Count > 0) && (clbSortField.CheckedItems.Count > 0) && (cboRosterField.SelectedIndex >= 0)) { string sql = "Select "; string topicID = ""; string order = ""; string orderType = ""; int groupID = 0; //成绩字段筛选 string[] keys = new string[DicSortField.Count]; DicSortField.Keys.CopyTo(keys, 0); for (int i = 0; i < DicSortField.Count; i++) { if (order.Length > 0) { order += ", "; sql += ", "; } switch (keys[i]) { case cScoreSumAvg: case cScoreSumSum: case cCorrectSumAvg: case cCorrectSumSum: orderType = " DESC "; break; case cSpeedSumAvg: case cSpeedSumSum: orderType = " ASC "; break; } order += DicSortField[i] + orderType; sql += DicSortField[i] + " AS " + keys[i]; } //题目筛选 string[] aryTopic = new string[lvwSlide.CheckedItems.Count]; for (int i = 0; i < lvwSlide.CheckedItems.Count; i++) { aryTopic[i] = lvwSlide.CheckedItems[i].Tag.ToString(); } topicID = string.Join(",", aryTopic); //分组字段筛选 if (cboRosterField.SelectedIndex >= 0) { groupID = Roster.Columns[cboRosterField.SelectedIndex].ColumnID; } string subSql = "Select Sum(ST_Response.R_Score) AS R_ScoreSum, Sum(ST_Response.R_Correct) AS R_CorrectSum, Sum(ST_Response.R_Speed) AS R_SpeedSum, ST_Voter.V_ID, ST_Voter.V_KeypadID, ST_Voter.RR_ID" + " FROM ST_Topic INNER JOIN (ST_Voter INNER JOIN ST_Response ON ST_Voter.V_ID = ST_Response.V_ID) ON ST_Topic.T_ID = ST_Response.T_ID" + " WHERE (((ST_Topic.TT_ID) IN(" + cResponseType + ")) AND ((ST_Topic.T_ID) In (" + topicID + ")))" + " GROUP BY ST_Voter.V_ID, ST_Voter.V_KeypadID, ST_Voter.RR_ID"; sql += ", ST_RosterValue.RV_Text, Count(RankVoter.V_ID) AS GroupCount" + " FROM (" + subSql + ") AS RankVoter INNER JOIN ST_RosterValue ON RankVoter.RR_ID = ST_RosterValue.RR_ID" + " WHERE (((ST_RosterValue.RC_ID)=" + groupID + "))" + " GROUP BY ST_RosterValue.RV_Text" + " ORDER BY " + order; GlobalInfo.DBOperation.OpenDataSet(sql); DataTable tb = GlobalInfo.DBOperation.DataSet.Tables[0]; if (tb.Rows.Count > 0) { dgvRank.Rows.Add(tb.Rows.Count); for (int iRow = 0; iRow < tb.Rows.Count; iRow++) { DataRow row = tb.Rows[iRow]; //名次 //dgvRank.Rows[iRow].Cells["RankSort"].Value = iRow + 1; //分组 for (int i = 0; i < cboRosterField.Items.Count; i++) { dgvRank.Rows[iRow].Cells["GroupValue"].Value = row["RV_Text"].ToString(); dgvRank.Rows[iRow].Cells["GroupCount"].Value = row["GroupCount"].ToString(); } bool isSame = (iRow > 0); //成绩 if (DicSortField.Contains(cScoreSumAvg)) { dgvRank.Rows[iRow].Cells[cScoreSumAvg].Value = tb.Rows[iRow][cScoreSumAvg]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cScoreSumAvg].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cScoreSumAvg].ToString()).ToDouble); } if (DicSortField.Contains(cCorrectSumAvg)) { dgvRank.Rows[iRow].Cells[cCorrectSumAvg].Value = tb.Rows[iRow][cCorrectSumAvg]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cCorrectSumAvg].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cCorrectSumAvg].ToString()).ToDouble); } if (DicSortField.Contains(cSpeedSumAvg)) { dgvRank.Rows[iRow].Cells[cSpeedSumAvg].Value = tb.Rows[iRow][cSpeedSumAvg]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cSpeedSumAvg].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cSpeedSumAvg].ToString()).ToDouble); } if (DicSortField.Contains(cScoreSumSum)) { dgvRank.Rows[iRow].Cells[cScoreSumSum].Value = tb.Rows[iRow][cScoreSumSum]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cScoreSumSum].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cScoreSumSum].ToString()).ToDouble); } if (DicSortField.Contains(cCorrectSumSum)) { dgvRank.Rows[iRow].Cells[cCorrectSumSum].Value = tb.Rows[iRow][cCorrectSumSum]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cCorrectSumSum].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cCorrectSumSum].ToString()).ToDouble); } if (DicSortField.Contains(cSpeedSumSum)) { dgvRank.Rows[iRow].Cells[cSpeedSumSum].Value = tb.Rows[iRow][cSpeedSumSum]; if (isSame) isSame = (ConvertOper.Convert(tb.Rows[iRow][cSpeedSumSum].ToString()).ToDouble == ConvertOper.Convert(tb.Rows[iRow - 1][cSpeedSumSum].ToString()).ToDouble); } //名次 if (isSame)//并列 dgvRank.Rows[iRow].Cells["RankSort"].Value = dgvRank.Rows[iRow - 1].Cells["RankSort"].Value; else//有差异 dgvRank.Rows[iRow].Cells["RankSort"].Value = iRow + 1; } } GlobalInfo.DBOperation.CloseDataSet(); } } catch (Exception ex) { SystemLog.WriterLog(ex); } ControlOper.AutoSizeDataGridViewColumn(dgvRank);//列宽自动适应 dgvRank.Visible = true; } /// /// 导出排行榜 /// public void ExportRank() { this.Cursor = Cursors.WaitCursor; string[,] aryTable = ControlOper.AryFromDataGrid(dgvRank); ExcelOper.ExportArrayToExcel(aryTable, this.Text); this.Cursor = Cursors.Default; } /// /// 选中查询的题目 /// /// /// private void lvwSlide_ItemChecked(object sender, ItemCheckedEventArgs e) { if (IsLoading) return; IsLoading = true; chkSelectAllSlide.Checked = ((lvwSlide.CheckedItems.Count > 0) && (lvwSlide.CheckedItems.Count == lvwSlide.Items.Count)); IsLoading = false; ShowRankGroup(); } /// /// 全选题目 /// /// /// private void chkSelectAllSlide_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; IsLoading = true; ControlOper.SelectAllListViewItem(lvwSlide, chkSelectAllSlide.Checked); IsLoading = false; ShowRankGroup(); } /// /// 选中查询的名单字段 /// /// /// private void clbRosterField_SelectedValueChanged(object sender, EventArgs e) { if (IsLoading) return; ShowRankGroup(); } /// /// 选中查询的分组字段 /// /// /// private void cboRosterField_SelectedIndexChanged(object sender, EventArgs e) { if (IsLoading) return; ShowRankGroup(); } /// /// 选中查询的排序字段 /// /// /// private void clbGroupItem_SelectedValueChanged(object sender, EventArgs e) { if (IsLoading) return; IsLoading = true; chkSelectAllGroupItem.Checked = ((clbGroupItem.CheckedItems.Count > 0) && (clbGroupItem.CheckedItems.Count == clbGroupItem.Items.Count)); IsLoading = false; ShowRankGroup(); } //选择分组类型 private void cboGroupType_SelectedIndexChanged(object sender, EventArgs e) { LoadGroupItem(); if (IsLoading) return; ShowRankGroup(); } //全选分组选项 private void chkSelectAllGroupItem_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; IsLoading = true; ControlOper.SelectAllCheckListBox(clbGroupItem, chkSelectAllGroupItem.Checked); IsLoading = false; ShowRankGroup(); } //排序方式选择 private void OrderBy_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; ShowRankGroup(); //杨斌 2014-07-25 Control ctrl = sender as Control; if (ctrl is RadioButton) GlobalInfo.IniCtlSystem.WriteValue(this.Name, "OrderField", ctrl.Name); if (ctrl is CheckBox) GlobalInfo.IniCtlSystem.WriteValue(this.Name, ctrl.Name, (ctrl as CheckBox).Checked ? 1 : 0); } //杨斌 2015-06-10 private void chkMVP_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; IsGroupMVP = chkMVP.Checked; ShowRankGroup(); } } }