/*------------------------------------------------------------------------------------------- * 多题分项对比/二题交叉对比 * 创建:杨斌 2011-12-01 * 修改:杨斌 2012-02-10 * ----------------------------------------------------------------------------------------*/ 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; namespace SunVoteARSPPT { public partial class FrmAnalyzeSlide : Form { /// /// 显示类型:0=多题分项对比,1=二题交叉对比 /// int ShowType = 0; /// /// 图表类 /// public ManageChart Chart = null; /// /// 是否反转交叉图表的对比选项 /// private bool IsInvertCross = false; public FrmAnalyzeSlide() { InitializeComponent(); } public FrmAnalyzeSlide(bool isCross) { InitializeComponent(); lblSlide.Left = lvwSlide.Left; if (isCross) { ShowType = 1; this.Text = "二题交叉对比"; btnInvert.Visible = true; lblSlide.Visible = true; chkSelectAllSlide.Visible = false; lvwSlide.Columns[0].Text = "编号"; } else { ShowType = 0; this.Text = "多题分项对比"; btnInvert.Visible = false; lblSlide.Visible = false; lvwSlide.Height += lvwSlide.Top - lblSlide.Top; lvwSlide.Top = lblSlide.Top; chkSelectAllSlide.Visible = true; chkSelectAllSlide.Top = lblSlide.Top + 4; } } //关闭窗体 private void btnClose_Click(object sender, EventArgs e) { this.Close(); } /// /// 是否正在加载窗体 /// private bool IsLoading = false; //加载窗体 private void FrmAnalyzeSlide_Load(object sender, EventArgs e) { IsLoading = true; ResponseDB.UpdateSlideIndexToDB(); Chart = new ManageChart(); Chart.MsChart = this.MSChart; MSChart.Dock = DockStyle.Fill; //此处加语言翻译过程 GlobalInfo.SysLanguage.SetLanguage(this.Name, this); ControlOper.SetPosCheckBoxToListViewHead(lvwSlide, chkSelectAllSlide);//杨斌 2012-11-16 LoadSlide(); ShowChart(); IsLoading = false; //杨斌 2014-07-25 List lstRadio = new List(); lstRadio.Add(GlobalInfo.IniCtlSystem.ReadString(this.Name, "ChartDataLabel", "")); lstRadio.Add(GlobalInfo.IniCtlSystem.ReadString(this.Name, "ChartType", "")); ControlOper.SetControlCheck(this, lstRadio); } /// /// 查询的反馈题目类型 /// private const string cResponseType = "'Group','Choice','Judge','Vote','Grade'";//'SignIn', /// /// 加载反馈幻灯片信息 /// private void LoadSlide() { try { lvwSlide.Items.Clear(); //加载数据 string sql = "Select * From ST_Topic" + " WHERE (((ST_Topic.TT_ID) IN(" + cResponseType + ")) AND (Len(ST_Topic.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]; 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(); //默认选中题目 switch (ShowType) { case 0: if (lvwSlide.Items.Count > 0) lvwSlide.Items[0].Checked = true; break; case 1: if (lvwSlide.Items.Count > 0) lvwSlide.Items[0].Checked = true; //if (lvwSlide.Items.Count > 1) lvwSlide.Items[1].Checked = true; break; } } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 刷新图表 /// private void ShowChart() { switch (ShowType) { case 0: ShowChartMultiComp(); break; case 1: ShowChartCrossComp(); break; } } /// /// 刷新图表数据 /// /// 图例文本 /// 选项系列文本 /// 数据 private void ShowChartData(string[] aryLegentText, string[] aryOptionText, List lstData) { //图例文本 Chart.LegentText = aryLegentText; Chart.XValue = aryOptionText; //数据值 Chart.YValues = lstData; //图表类型 RadioButton rbtChartType = ControlOper.GetChecked(rbtChartType2); Chart.ChartType = EnumName.GetEnum(rbtChartType.Tag.ToString()); Chart.Is3D = (rbtChartType.Name.IndexOf("3D") > 0); //图表数据标签样式 RadioButton rbtChartDataLabel = ControlOper.GetChecked(rbtChartDataLabel1); Chart.LabelType = EnumName.GetEnum(rbtChartDataLabel.Tag.ToString()); //图表图例显示 Chart.LegendEnable = true; Chart.LegentDocking = LegentDockings.ldTop;//原来是右边,后应日本客户要求改成顶部。杨斌 2012-10-09 //图表高度 Chart.Width = MSChart.Width; Chart.Height = MSChart.Height; Chart.UpdateChart();//刷新图表 } /// /// 刷新多题分项对比图表 /// private void ShowChartMultiComp() { try { MSChart.Visible = false; //获取题目ID和标题 int topicCount = lvwSlide.CheckedItems.Count; if (topicCount < 1) return; string[] aryTopicID = new string[topicCount]; string[] aryTopicText = new string[topicCount]; for (int i = 0; i < topicCount; i++) { aryTopicID[i] = lvwSlide.CheckedItems[i].Tag.ToString(); aryTopicText[i] = lvwSlide.CheckedItems[i].Text + ". " + lvwSlide.CheckedItems[i].SubItems[1].Text; } string topicID = string.Join(",", aryTopicID); //获取最大选项个数 int maxOptionCount = 0; string sql = "SELECT Max(CStr(ST_TopicPar.TP_Value)) AS TP_OptionCountMax" + " FROM ST_TopicPar" + " WHERE (((ST_TopicPar.T_ID) In (" + topicID + ")) AND ((ST_TopicPar.TP_Name)='OptionCount'))"; 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]; maxOptionCount = ConvertOper.Convert(row["TP_OptionCountMax"].ToString()).ToInt; } GlobalInfo.DBOperation.CloseDataSet(); if (maxOptionCount < 1) return; //设置选项文本 string[] aryOption = new string[maxOptionCount]; //杨斌 2014-10-21 string sID = aryTopicID[0]; if (lvwSlide.SelectedItems.Count > 0) { if (lvwSlide.CheckedItems.Contains(lvwSlide.SelectedItems[0])) sID = lvwSlide.SelectedItems[0].Tag.ToString(); } Dictionary dicOption = ReportEx.GetTopicOption(sID); for (int i = 0; i < aryOption.Length; i++) { aryOption[i] = PPTOper.FormatNumABC(i + 1, true);//杨斌 2012-06-29 string sNo = (i + 1).ToString(); if (dicOption.ContainsKey(sNo)) aryOption[i] += "." + dicOption[sNo]; } //加载数据 List lstData = new List(); TDictionary dicData = new TDictionary(); for (int i = 0; i < topicCount; i++) { double[] data = new double[maxOptionCount]; dicData.Add(aryTopicID[i], data); } sql = "SELECT ST_Response.T_ID, ST_Response.R_Result" + " 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 tId = row["T_ID"].ToString(); tId = "'" + tId + "'"; string result = row["R_Result"].ToString() + ",";//多加一个分隔符,以便搜索判断选项是否存在 for (int n = 1; n <= maxOptionCount; n++) { if (result.Contains(n + ",")) { double[] dataTemp = (double[])(dicData[tId]); dataTemp[n - 1]++; dicData.Remove(tId); dicData.Add(tId, dataTemp); } } } GlobalInfo.DBOperation.CloseDataSet(); //杨斌 2014-12-11 //for (int i = 0; i < dicData.Count; i++) //{ // lstData.Add((double[])(dicData[i])); //} for (int i = 0; i < aryTopicID.Length; i++) { lstData.Add((double[])(dicData[aryTopicID[i]])); } //刷新图表 ShowChartData(aryTopicText, aryOption, lstData); MSChart.Visible = true; } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 刷新二题交叉对比图表 /// private void ShowChartCrossComp() { try { MSChart.Visible = false; //获取题目ID和标题 int topicCount = lvwSlide.CheckedItems.Count; if (topicCount != 2) return; string[] aryTopicID = new string[topicCount]; string[] aryTopicText = new string[topicCount]; for (int i = 0; i < topicCount; i++) { aryTopicID[i] = lvwSlide.CheckedItems[i].Tag.ToString(); aryTopicText[i] = lvwSlide.CheckedItems[i].SubItems[1].Text; } string topicID = string.Join(",", aryTopicID); //获取选项个数、最大选项个数 int maxOptionCount = 0; TDictionary dicOptionCount = new TDictionary(); string sql = "SELECT ST_TopicPar.T_ID, ST_TopicPar.TP_Value" + " FROM ST_TopicPar" + " WHERE (((ST_TopicPar.T_ID) In (" + topicID + ")) AND ((ST_TopicPar.TP_Name)='OptionCount'))"; 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 id = "'" + row["T_ID"].ToString() + "'"; int count = ConvertOper.Convert(row["TP_Value"].ToString()).ToInt; if ((count > 0) && (!dicOptionCount.Contains(id))) { dicOptionCount.Add(id, count); if (count > maxOptionCount) maxOptionCount = count; } } GlobalInfo.DBOperation.CloseDataSet(); if (dicOptionCount.Count < 2) return; //获取选项文本 string[] aryWherePar = new string[maxOptionCount]; for (int i = 0; i < maxOptionCount; i++) { aryWherePar[i] = "'OptionText_" + (i + 1).ToString() + "'"; } string wherePar = string.Join(",", aryWherePar); TDictionary dicOptionText = new TDictionary();//Key=题目ID,Item=选项文本[] sql = "SELECT DISTINCT ST_TopicPar.T_ID, ST_TopicPar.TP_Name, ST_TopicPar.TP_Value" + " FROM ST_TopicPar" + " WHERE (((ST_TopicPar.TP_Name) In (" + wherePar + ")) AND ((ST_TopicPar.T_ID) In (" + topicID + ")))" + " ORDER BY ST_TopicPar.T_ID, ST_TopicPar.TP_Name"; 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 id = "'" + row["T_ID"].ToString() + "'"; string tName = row["TP_Name"].ToString(); string tValue = row["TP_Value"].ToString(); int optionCount = dicOptionCount[id]; int index = ConvertOper.Convert(tName.Replace("OptionText_", "")).ToInt - 1; if (dicOptionText.Contains(id)) { if ((index >= 0) && (index < optionCount)) dicOptionText[id][index] = tValue; } else { string[] options = new string[optionCount]; for (int i = 0; i < optionCount; i++) options[i] = ""; if ((index >= 0) && (index < optionCount)) options[index] = tValue; dicOptionText.Add(id, options); } } GlobalInfo.DBOperation.CloseDataSet(); //设置二维图表选项文本 string idQ1 = ""; string idQ2 = ""; idQ1 = aryTopicID[0]; idQ2 = aryTopicID[1]; string[] aryOptionQ1 = dicOptionText[idQ1]; string[] aryOptionQ2 = dicOptionText[idQ2]; //加载数据 TDictionary dicResultQ1 = new TDictionary(); TDictionary dicResultQ2 = new TDictionary(); List lstVId = new List(); int countOptionQ1 = dicOptionCount[idQ1]; int countOptionQ2 = dicOptionCount[idQ2]; sql = "SELECT ST_Response.V_ID, ST_Response.T_ID, ST_Response.R_Result" + " 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 id = row["V_ID"].ToString(); string tid = "'" + row["T_ID"].ToString() + "'"; string result = row["R_Result"].ToString() + ","; if (tid == idQ1) { if (!dicResultQ1.Contains(id)) dicResultQ1.Add(id, result); } if (tid == idQ2) { if (!dicResultQ2.Contains(id)) dicResultQ2.Add(id, result); } if (!lstVId.Contains(id)) lstVId.Add(id); } GlobalInfo.DBOperation.CloseDataSet(); List lstData = new List(); for (int i = 0; i < countOptionQ1; i++) { double[] aryData = new double[countOptionQ2]; lstData.Add(aryData); } for (int i = 0; i < lstVId.Count; i++) { string id = lstVId[i]; if ((dicResultQ1.Contains(id)) && (dicResultQ2.Contains(id))) { for (int n1 = 0; n1 < countOptionQ1; n1++) { for (int n2 = 0; n2 < countOptionQ2; n2++) { string resultQ1 = dicResultQ1[id]; string resultQ2 = dicResultQ2[id]; string noQ1 = (n1 + 1).ToString() + ","; string noQ2 = (n2 + 1).ToString() + ","; if (resultQ1.Contains(noQ1) && resultQ2.Contains(noQ2)) { lstData[n1][n2]++; } } } } } //刷新图表 if (IsInvertCross) ShowChartData(aryOptionQ2, aryOptionQ1, lstData); else ShowChartData(aryOptionQ1, aryOptionQ2, lstData); MSChart.Visible = true; } catch (Exception ex) { SystemLog.WriterLog(ex); } } /// /// 是否全屏 /// private bool IsFullScreen = false; private Point OldFrmPoint; private Size OldFrmSize; private Point OldPnlPoint; private Size OldPnlSize; /// /// 全屏显示图表 /// private void ShowChartFull() { if (IsFullScreen) { IsFullScreen = false; this.ControlBox = true; this.Text = this.Tag.ToString(); pnlChart.Dock = DockStyle.None; this.Location = OldFrmPoint; this.Size = OldFrmSize; pnlChart.Location = OldPnlPoint; pnlChart.Size = OldPnlSize; pnlChart.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; } else { IsFullScreen = true; OldFrmPoint = this.Location; OldFrmSize = this.Size; OldPnlPoint = pnlChart.Location; OldPnlSize = pnlChart.Size; this.Tag = this.Text; this.Text = ""; this.ControlBox = false; pnlChart.Dock = DockStyle.Fill; pnlChart.BringToFront(); this.Location = new Point(0, 0); //杨斌 2014-09-17 Screen scrShow = ControlOper.GetSecondScreen(); this.Size = new Size(scrShow.Bounds.Width, scrShow.Bounds.Height); } ControlOper.CenterForm(this, IsFullScreen);//杨斌 2014-09-17 } //选中全部题目 private void chkSelectAllSlide_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; IsLoading = true; ControlOper.SelectAllListViewItem(lvwSlide, chkSelectAllSlide.Checked); IsLoading = false; ShowChart(); } //勾选中题目 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; if (ShowType == 1) IsInvertCross = false; ShowChart(); } //二题交叉对比只允许选中2个题目 private void lvwSlide_ItemCheck(object sender, ItemCheckEventArgs e) { if (ShowType != 1) return; if (e.NewValue == CheckState.Checked) { if (lvwSlide.CheckedItems.Count >= 2) e.NewValue = CheckState.Unchecked; } } //设置图表标签样式 private void rbtChartDataLabel_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; ShowChart(); GlobalInfo.IniCtlSystem.WriteValue(this.Name, "ChartDataLabel", (sender as Control).Name);//杨斌 2014-07-25 } //设置图表样式 private void rbtChartType_CheckedChanged(object sender, EventArgs e) { if (IsLoading) return; ShowChart(); GlobalInfo.IniCtlSystem.WriteValue(this.Name, "ChartType", (sender as Control).Name);//杨斌 2014-07-25 } //双击全屏 private void pnlChart_DoubleClick(object sender, EventArgs e) { ShowChartFull(); } //反转对比选项 private void btnInvert_Click(object sender, EventArgs e) { if (IsLoading) return; IsInvertCross = !IsInvertCross; ShowChart(); } //窗体按键响应 private void FrmAnalyzeSlide_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Escape: if (IsFullScreen) ShowChartFull(); else this.Close(); break; } } private void lvwSlide_SelectedIndexChanged(object sender, EventArgs e) { ShowChart();//杨斌 2014-10-21 } } }