/*-------------------------------------------------------------------------------------------
* 多题分项对比/二题交叉对比
* 创建:杨斌 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
}
}
}