using DevExpress.Utils; using DevExpress.XtraCharts; using OTSIncAReportApp; using OTSIncAReportApp._1_UI.Control_DEVCharts; using OTSIncAReportApp.OTSRstMgrFunction; using OTSIncAReportApp.OTSSampleReportInfo; using OTSIncAReportApp.SysMgrTools; using OTSIncAReportGraph.Class; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Windows.Forms; namespace OTSIncAReportGrids { /// /// 颗粒平均元素成分含量表 平均元素含量表 /// public partial class ElementCompositionAvgGrid : UserControl { #region 设置变量 //设置模拟数据表 public DataTable m_dt = new DataTable(); //多个数据源,每个数据源拥有的列数,这里保存下来,供分组使用 public List m_list_oneresult_columncount; //国际化 Language lan; Hashtable table; //测量结果 ResultFile result = null; OTSIncAReportApp.frmReportApp m_ReportApp; //internal string condition; private DataGridView dgv = new DataGridView(); frmReportConditionChoose m_condition; private ResultDataMgr m_DataMgr; int gridheight = 0; int gridwidth = 0; public bool Report { set; get; } /// /// 全部颗粒为true选择颗粒为false /// public bool ParticleRange { set; get; } /// /// 表数据 /// List list_table_data = new List(); List list_table_size = new List(); List list_table_Point = new List(); List list_fileName = new List(); #endregion #region 自定义方法 /// /// 绑定datagridview数据 /// public void BindDataGridView(string path, int num, string filename,int sel) { List colid = new List() { "rowid", "pname", "area", "con" }; List colname = new List() { table["str1"].ToString(), table["str4"].ToString(), table["str3"].ToString(), table["str6"].ToString() }; OTSIncAReportApp.DataOperation.DataAccess.ParticleData particledata = new OTSIncAReportApp.DataOperation.DataAccess.ParticleData(path); OTSGridView gridView = new OTSGridView(); for (int i = 0; i < colid.Count; i++) { gridView.Columns.Add(colid[i], colname[i]); } DataTable dte = particledata.GetAllElement(); DataTable table_data = new DataTable(); table_data.Columns.Add("TypeName"); table_data.Columns.Add("con"); table_data.Columns.Add("ar"); foreach (DataRow item in dte.Rows) { DataGridViewImageColumn iconColumn = new DataGridViewImageColumn(); iconColumn.Name = item["name"].ToString(); iconColumn.HeaderText = item["name"].ToString(); gridView.Columns.Add(iconColumn); table_data.Columns.Add(item["name"].ToString()); } List FLID = new List() { 0, 1, 2, 4, 6, 7, 8, 9 }; List NameList = new List() { table["partcletype0"].ToString(), table["partcletype1"].ToString(), table["partcletype2"].ToString(), table["partcletype4"].ToString(), table["partcletype6"].ToString(), table["partcletype7"].ToString(), table["partcletype8"].ToString(), table["partcletype9"].ToString() }; string filedAndParticl = ""; gridView.MergeColumnNames.Add(filename); gridView.AddSpanHeader(1, gridView.Columns.Count - 1, filename); DataTable dt; dt = particledata.GetAreaByAllIncA(filedAndParticl); for (int i = 0; i < dt.Rows.Count; i++) { if (Convert.ToInt32(dt.Rows[i]["TypeId"]) < 100) { continue; } double total = Convert.ToDouble(dt.Rows[i]["ar"]); int add_rowindex = gridView.Rows.Add(); gridView.Rows[add_rowindex].Cells[0].Value = add_rowindex + 1; gridView.Rows[add_rowindex].Cells[1].Value = dt.Rows[i]["TypeName"]; gridView.Rows[add_rowindex].Cells[1].Style.BackColor = Color.Azure; gridView.Rows[add_rowindex].Cells[2].Value = Math.Round(total, 2); gridView.Rows[add_rowindex].Cells[2].Style.BackColor = Color.Azure; gridView.Rows[add_rowindex].Cells[3].Value = dt.Rows[i]["con"]; gridView.Rows[add_rowindex].Cells[3].Style.BackColor = Color.Azure; DataTable dtp = particledata.GetAreaByIncA(dt.Rows[i]["TypeId"].ToString(), filedAndParticl); DataRow row1 = table_data.NewRow(); row1["TypeName"] = dt.Rows[i]["TypeName"]; row1["con"] = dt.Rows[i]["con"]; row1["ar"] = Math.Round(total, 2); for (int j = 4; j < gridView.Columns.Count; j++) { int col = 0; foreach (DataRow dr in dtp.Rows) { if (gridView.Columns[j].Name == dr["name"].ToString()) { double ar = Convert.ToDouble(dr["pc"]); double p = Math.Round(ar / total, 2); gridView.Rows[add_rowindex].Cells[j].Value = DrawFunction.GetProcessBitmap((float)p, Color.Azure); gridView.Rows[add_rowindex].Cells[j].Tag = p; row1[gridView.Columns[j].Name] = p; break; } col++; } if (col == dtp.Rows.Count) { gridView.Rows[add_rowindex].Cells[j].Value = DrawFunction.GetProcessBitmap(0, Color.Azure); gridView.Rows[add_rowindex].Cells[j].Tag = 0; } } table_data.Rows.Add(row1); } for (int i = 0; i < dt.Rows.Count; i++) { if (Convert.ToInt32(dt.Rows[i]["TypeId"]) > 100) { continue; } int add_rowindex = gridView.Rows.Add(); gridView.Rows[add_rowindex].Cells[0].Value = add_rowindex + 1; int index = FLID.IndexOf(Convert.ToInt32(dt.Rows[i]["TypeId"])); if (index == -1) { index = 7; } string name = NameList[index]; double total = Convert.ToDouble(dt.Rows[i]["ar"]); gridView.Rows[add_rowindex].Cells[1].Value = dt.Rows[i]["TypeName"]; gridView.Rows[add_rowindex].Cells[1].Style.BackColor = Color.Azure; gridView.Rows[add_rowindex].Cells[2].Value = Math.Round(total, 2); gridView.Rows[add_rowindex].Cells[2].Style.BackColor = Color.Azure; gridView.Rows[add_rowindex].Cells[3].Style.BackColor = Color.Azure; gridView.Rows[add_rowindex].Cells[3].Value = dt.Rows[i]["con"]; DataTable dtp = particledata.GetAreaByIncA(dt.Rows[i]["TypeId"].ToString(), filedAndParticl); for (int j = 4; j < gridView.Columns.Count; j++) { int col = 0; foreach (DataRow dr in dtp.Rows) { if (gridView.Columns[j].Name == dr["name"].ToString()) { double ar = Convert.ToDouble(dr["pc"]); double p = Math.Round(ar / total, 2); gridView.Rows[add_rowindex].Cells[j].Value = DrawFunction.GetProcessBitmap((float)p, Color.Azure); gridView.Rows[add_rowindex].Cells[j].Tag = p; break; } col++; } if (col == dtp.Rows.Count) { gridView.Rows[add_rowindex].Cells[j].Value = DrawFunction.GetProcessBitmap(0, Color.Azure); gridView.Rows[add_rowindex].Cells[j].Tag = 0; } } } list_table_data.Add(table_data); gridView.Name = "gridView" + num.ToString(); dgv = gridView; //设置grid风格 list_table_Point.Add(SetDataGridViewStyle(gridView)); //SetDataGridViewStyle(gridView); panel1.Controls.Add(gridView); } /// /// 设置DataGridView样式 /// private Point SetDataGridViewStyle(OTSGridView gridView) { //用户不能调整标题的高度 gridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //用户不能调整 行高 gridView.AllowUserToResizeRows = false; //改变行的高度; //gridView.RowTemplate.Height = 20; //点击选择整行 gridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //居中显示 System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; gridView.DefaultCellStyle = dataGridViewCellStyle1; gridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //再次重覆禁用拖动表头高度,居然有效果了 gridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //设置grid可以复制 gridView.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; //设置每列的宽度 gridView.Columns[0].Width = 40;//第一列序号的宽度设置一下吧,要不太丑 gridView.Columns[1].Width = 200; //设置序号列不排序 gridView.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable; //设置序号列不可以设置宽度 gridView.Columns[0].Resizable = DataGridViewTriState.False; gridView.AllowUserToAddRows = false; gridView.AllowUserToDeleteRows = false; gridView.AllowUserToResizeRows = false; gridView.BackgroundColor = System.Drawing.SystemColors.ButtonHighlight; gridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; gridView.ContextMenuStrip = this.contextMenuStrip1; gridView.BorderStyle = 0; int outpos = gridwidth; gridView.Location = new System.Drawing.Point(gridwidth, 0); gridView.Margin = new System.Windows.Forms.Padding(2); gridView.MergeColumnHeaderBackColor = System.Drawing.SystemColors.ButtonHighlight; //gridView.Name = "Gview_gz"; gridView.ReadOnly = true; gridView.RowHeadersVisible = false; gridView.RowHeadersWidth = 40; gridView.RowTemplate.Height = 30; int gridView_Width = 0; for (int i = 0; i < gridView.ColumnCount; i++) { gridView_Width = gridView_Width + gridView.Columns[i].Width; } gridView.Size = new System.Drawing.Size(gridView_Width+60, gridView.RowCount * 30); gridheight = gridheight + gridView.RowCount * 30 + 5; gridwidth = gridwidth + gridView.ColumnCount * 100; gridView.TabIndex = 0; gridView.SortCompare += new System.Windows.Forms.DataGridViewSortCompareEventHandler(this.Gview_gz_SortCompare); gridView.Sorted += new System.EventHandler(this.Gview_gz_Sorted); //先设置一下头的高度,否则会太矮不好看 gridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing; gridView.ColumnHeadersHeight = 40; list_table_size.Add(new Point(gridView.ColumnCount * 100 , gridView.RowCount * 30)); return new Point(outpos, gridheight); } #endregion #region 初始化构造函数 /// /// 元素平均含量表,构造函数 /// /// 传入,委托类对象 /// 传入,项目管理类对象 public ElementCompositionAvgGrid(OTSIncAReportApp.frmReportApp ReportApp) { m_ReportApp = ReportApp; result = m_ReportApp.m_rstDataMgr.ResultFilesList[m_ReportApp.m_rstDataMgr.GetWorkingResultId()]; m_condition = ReportApp.m_conditionChoose; InitializeComponent(); lan = new Language(this); table = lan.GetNameTable(this.Name); m_DataMgr = ReportApp.m_rstDataMgr; } private void ElementContentGrid_Load(object sender, EventArgs e) { string sou = ""; int sel = 0; if (Report) { sou = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResultId()].anotherFileName.ToString(); if (ParticleRange) { sel = 0; } else { sel = 1; } } else { sou = m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemDisplayVal.ToString(); sel = m_ReportApp.m_conditionChoose.m_conditionData.GetComboDownListIndexByItemName(OTSIncAReportApp.OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE); } Report = false; list_fileName.Clear(); if (sou.Contains("+")) { for (int i = 0; i < sou.Split('+').Length; i++) { ResultFile resultFile = m_ReportApp.m_rstDataMgr.ResultFilesList.Find(s => s.anotherFileName == sou.Split('+')[i]); if (resultFile != null) { BindDataGridView(resultFile.FilePath, i, resultFile.anotherFileName, sel); list_fileName.Add(resultFile.anotherFileName); } } } else { for (int i = 0; i < m_ReportApp.m_rstDataMgr.ResultFilesList.Count; i++) { if (sou == m_ReportApp.m_rstDataMgr.ResultFilesList[i].anotherFileName.ToString()) { BindDataGridView(m_ReportApp.m_rstDataMgr.ResultFilesList[i].FilePath, 0, m_ReportApp.m_rstDataMgr.ResultFilesList[i].anotherFileName, sel); list_fileName.Add(m_ReportApp.m_rstDataMgr.ResultFilesList[i].anotherFileName); } } } } public void SetGraphicType(ReportCondition sourceGridData) { string stdId = ""; int stdIdIndex = 0; //find the stdId condition var STDIdItm = sourceGridData.ConditionItemList.Find(s => s.iItemId == OTS_REPORT_PROP_GRID_ITEMS.STD_ID); if (STDIdItm != null) { stdId = STDIdItm.itemDisplayVal.ToString(); stdIdIndex = STDIdItm.comboDownList.IndexOf(stdId); } string stdId_TYPE = ""; int stdIdIndex_TYPE = 0; //find the stdId condition var STDIdItm_TYPE = sourceGridData.ConditionItemList.Find(s => s.iItemId == OTS_REPORT_PROP_GRID_ITEMS.GRAPHIC_TYPE); if (STDIdItm_TYPE != null) { stdId_TYPE = STDIdItm_TYPE.itemDisplayVal.ToString(); stdIdIndex_TYPE = STDIdItm_TYPE.comboDownList.IndexOf(stdId); } int high = 0; for (int i = 0; i < list_table_Point.Count; i++) { if (high < list_table_Point[i].Y) { high = list_table_Point[i].Y; } } for (int i = 0; i < list_table_data.Count; i++) { Graphics(list_table_data[i], list_fileName[i], stdId_TYPE, list_table_size[i], list_table_Point[i], high); Graphics_Stacking(list_table_data[i], stdId, list_table_size[i], list_table_Point[i], high+ list_table_size[i].Y); } } private void Graphics(DataTable data, string filename, string comboBox1Text, Point a_size, Point a_Location, int location_hig) { ChartControl chartControl1 = new ChartControl(); chartControl1.Series.Clear(); // 假设你已经有一个 ChartControl 实例,并且已经添加了一个饼图 Series Series series = new Series(filename, ViewType.Bar); for (int a = 0; a < data.Rows.Count; a++) { string name = data.Rows[a]["TypeName"].ToString(); double Cunt = Convert.ToDouble(data.Rows[a]["ar"]); series.Points.Add(new SeriesPoint(name, Cunt)); } series.LabelsVisibility = DefaultBoolean.True; chartControl1.Series.Add(series); //图例的位置定义 chartControl1.Legend.AlignmentVertical = LegendAlignmentVertical.Top; chartControl1.Legend.AlignmentHorizontal = LegendAlignmentHorizontal.RightOutside; chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; chartControl1.Legend.Direction = LegendDirection.TopToBottom; //十字准线光标 chartControl1.CrosshairEnabled = DefaultBoolean.True; chartControl1.CrosshairOptions.ShowValueLine = true; chartControl1.CrosshairOptions.ShowArgumentLabels = true; DevFunctions.ChangeView2(chartControl1, comboBox1Text); chartControl1.Location = new Point(a_Location.X, location_hig); chartControl1.Size = new Size(a_size.X, a_size.Y); // 获取图表的坐标系(通常为 XYDiagram) XYDiagram diagram = chartControl1.Diagram as XYDiagram; if (diagram != null) { // 设置横坐标(X轴)名称 diagram.AxisX.Title.Text = "种类"; diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.True; // 确保标题可见 // 设置纵坐标(Y轴)名称 diagram.AxisY.Title.Text = "面积"; diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True; // 确保标题可见 } panel1.Controls.Add(chartControl1); } /// /// chart图创建 /// /// /// private void Graphics_Stacking(DataTable dt, string stdId, Point a_size, Point a_Location, int location_hig) { ChartControl chartControl1 = new ChartControl(); chartControl1.Series.Clear(); chartControl1.Size = new Size(a_size.X, a_size.Y); chartControl1.Location = new Point(a_Location.X, location_hig); DataTable dataTable = new DataTable(); dataTable.Columns.Add("name"); dataTable.Columns.Add("size"); if (stdId != "All") { for (int i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["TypeName"].ToString() == stdId) { for (int a = 3; a < dt.Columns.Count; a++) { DataRow dr = dataTable.NewRow(); dr["name"] = dt.Columns[a].ColumnName; if (dt.Rows[i][a].ToString() == "") { dr["size"] = 0; } else { dr["size"] = Convert.ToDouble(dt.Rows[i][a]); } dataTable.Rows.Add(dr); } } } } if (stdId == "All") { List seriesList = new List(); DataTable data = new DataTable(); data.Columns.Add("name"); data.Columns.Add("range"); data.Columns.Add("num"); for (int i = 0; i < dt.Rows.Count; i++) { for (int a = 3; a < dt.Columns.Count; a++) { DataRow dr = data.NewRow(); dr["name"] = dt.Rows[i]["TypeName"].ToString(); dr["range"] = dt.Columns[a].ColumnName; if (dt.Rows[i][a].ToString() == "") { dr["num"] = 0; } else { dr["num"] = dt.Rows[i][a].ToString(); } data.Rows.Add(dr); } } foreach (DataRow dr in data.DefaultView.ToTable(true, "name").Rows) { Series s = new Series(dr["name"].ToString(), ViewType.StackedBar) { LegendTextPattern = dr["name"].ToString(), ArgumentScaleType = ScaleType.Qualitative, }; foreach (DataRow drl in data.Select("name='" + dr["name"].ToString() + "'")) s.Points.Add(new SeriesPoint(drl["range"].ToString(), double.Parse(drl["num"].ToString()))); s.LabelsVisibility = DefaultBoolean.False; seriesList.Add(s); } foreach (Series sr in seriesList.ToArray()) chartControl1.Series.Add(sr); } else { // 假设你已经有一个 ChartControl 实例,并且已经添加了一个饼图 Series Series series = new Series(stdId, ViewType.Bar); for (int a = 0; a < dataTable.Rows.Count; a++) { string name = dataTable.Rows[a]["name"].ToString(); double Cunt = Convert.ToDouble(dataTable.Rows[a]["size"]); series.Points.Add(new SeriesPoint(name, Cunt)); } series.LabelsVisibility = DefaultBoolean.True; chartControl1.Series.Add(series); } ((XYDiagram)chartControl1.Diagram).AxisY.Title.Text = ""; ((XYDiagram)chartControl1.Diagram).AxisX.Title.Text = ""; ((XYDiagram)chartControl1.Diagram).AxisY.Title.Visibility = DefaultBoolean.True; ((XYDiagram)chartControl1.Diagram).AxisX.Title.Visibility = DefaultBoolean.True; ((XYDiagram)chartControl1.Diagram).AxisY.Title.Font = new Font("Tahoma", 9); ((XYDiagram)chartControl1.Diagram).AxisX.Title.Font = new Font("Tahoma", 9); ((XYDiagram)chartControl1.Diagram).AxisY.Title.Alignment = System.Drawing.StringAlignment.Far; ((XYDiagram)chartControl1.Diagram).AxisX.Title.Alignment = System.Drawing.StringAlignment.Far; //图例的位置定义 chartControl1.Legend.AlignmentVertical = LegendAlignmentVertical.Top; chartControl1.Legend.AlignmentHorizontal = LegendAlignmentHorizontal.RightOutside; chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False; chartControl1.Legend.Direction = LegendDirection.TopToBottom; //十字准线光标 chartControl1.CrosshairEnabled = DefaultBoolean.True; chartControl1.CrosshairOptions.ShowValueLine = true; chartControl1.CrosshairOptions.ShowArgumentLabels = true; panel1.Controls.Add(chartControl1); } #endregion #region 相关事件 private void ToolStripMenuItem1_Click(object sender, EventArgs e) { //复制整个表 CopyAll(); } private void ToolStripMenuItem2_Click(object sender, EventArgs e) { //复制选择区域 CopySelected(); } /// /// 复制选择区域 /// public void CopySelected() { //复制选择区域 object oo = Gview_gz.GetClipboardContent(); Clipboard.SetDataObject(Gview_gz.GetClipboardContent()); } /// /// 复制所有 /// public void CopyAll() { Gview_gz.SelectAll(); Clipboard.SetDataObject(Gview_gz.GetClipboardContent()); } private void ToolStripMenuItem3_Click(object sender, EventArgs e) { //恢复至初始状态 Gview_gz.Rows.Clear(); Gview_gz.Columns.Clear(); //BindDataGridView(); //SetDataGridViewStyle(); } private void Gview_gz_SortCompare(object sender, DataGridViewSortCompareEventArgs e) { //排序中 if (this.Gview_gz.Rows[e.RowIndex1].Tag != null && this.Gview_gz.Rows[e.RowIndex1].Tag.ToString() == "统计行") { //ROW1>ROW2 e.SortResult = 1; if (this.Gview_gz.SortOrder == SortOrder.Descending) e.SortResult = -1; e.Handled = true; return; } if (this.Gview_gz.Rows[e.RowIndex2].Tag != null && this.Gview_gz.Rows[e.RowIndex2].Tag.ToString() == "统计行") { //ROW1 /// 获取到该模块输出后形成的DataTable,和GridView /// /// /// public void GetDataTableAndGridView(out DataTable out_dt, out DataGridView out_dg) { out_dt = m_dt; //out_dt = (this.Gview_gz.DataSource as DataTable); //out_dg = this.Gview_gz; out_dg = dgv; } #endregion } }