240 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.Threading.Tasks;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace Volian.Controls.Library
 | |
| {
 | |
|     //C2025-023 Electronic Procedures
 | |
|     //Control for designating which cells in a table require EP input 
 | |
|     public partial class TablePropertiesControl : UserControl
 | |
|     {
 | |
|         //defines the type of possible inputs from an EP viewer
 | |
|         public enum EPinputtype
 | |
|         {
 | |
|             none,
 | |
|             textbox,
 | |
|             checkbox
 | |
|         };
 | |
| 
 | |
|         private DataTable values;
 | |
|         private BindingSource bindingSource = null;
 | |
|         private int totalrows = 1;
 | |
|         private int totalcols = 1;
 | |
|         public readonly string epname;
 | |
|         private bool IsInitializing;
 | |
| 
 | |
|         //initialization / data will be in the format:
 | |
|         // totalnumrows,totalnumcols;(row,col):value|(row,col):value...
 | |
|         public TablePropertiesControl(string name, string title, string initialvalues)
 | |
|         {
 | |
|             InitializeComponent();
 | |
| 
 | |
|             IsInitializing = true;
 | |
| 
 | |
|             epname = name;
 | |
|             lbltitle.Text = title;
 | |
|             initializevalues(initialvalues);
 | |
|             bindingSource = new BindingSource(values, "");
 | |
|             dataview.DataSource = bindingSource;
 | |
|             dataview.AutoGenerateColumns = false;
 | |
| 
 | |
|             Load += new EventHandler(FormLoad_setDefaults);
 | |
|         }
 | |
| 
 | |
|         //initialization / data will be in the format:
 | |
|         // totalnumrows,totalnumcols;(row,col):value|(row,col):value...
 | |
|         private void initializevalues(string initialvalues)
 | |
|         {
 | |
|             values = new DataTable("values");
 | |
| 
 | |
|             if (!string.IsNullOrEmpty(initialvalues))
 | |
|             {
 | |
|                 string[] grp = initialvalues.Split(';');
 | |
|                 string[] total = grp[0].Split(',');
 | |
|                 initializedt(int.Parse(total[0]), int.Parse(total[1]));
 | |
| 
 | |
|                 string[] ivs = grp[1].Split('|');
 | |
|                 //pair will be of format:
 | |
|                 //(row,col):value
 | |
|                 foreach (string pair in ivs)
 | |
|                 {
 | |
|                     Match m = Regex.Match(pair, @"\(([\d]),([\d])\):([\w]+)");
 | |
|                     if (m.Success)
 | |
|                     {
 | |
|                         int row = int.Parse(m.Groups[1].Value);
 | |
|                         int col = int.Parse(m.Groups[2].Value);
 | |
|                         string v = m.Groups[3].Value;
 | |
|                         values.Rows[row][col] = v;
 | |
|                     }
 | |
| 
 | |
|                 }
 | |
| 
 | |
|                 values.AcceptChanges();
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 initializedt(1, 1);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //initialize the blank datatable
 | |
|         private void initializedt(int numrows, int numcols)
 | |
|         {
 | |
|             totalrows = numrows;
 | |
|             totalcols = numcols;
 | |
| 
 | |
|             for (int c = 0; c < totalcols; c++)
 | |
|             {
 | |
|                 values.Columns.Add(new DataColumn($"Column{c}") { DefaultValue = "none" });
 | |
|             }
 | |
| 
 | |
|             for (int rw = 0; rw < totalrows; rw++)
 | |
|             {
 | |
|                 values.Rows.Add();
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         void FormLoad_setDefaults(object sender, EventArgs e)
 | |
|         {
 | |
|             BindingSource bindingSourceDropDown = new BindingSource();
 | |
|             bindingSourceDropDown.DataSource = Enum.GetNames(typeof(EPinputtype));
 | |
| 
 | |
|             //in order to achieve a dropdown of possible values need
 | |
|             //to remove the auto-inserted columns
 | |
|             //that were auto-generated of type type text
 | |
|             //when values was bound to the datagrid
 | |
|             for (int c = 0; c < totalcols; c++)
 | |
|             {
 | |
|                 dataview.Columns.RemoveAt(c);
 | |
|                 var cName = new DataGridViewComboBoxColumn();
 | |
|                 cName.DataSource = bindingSourceDropDown;
 | |
|                 cName.DefaultCellStyle.NullValue = "none";
 | |
|                 dataview.Columns.Insert(c, cName);
 | |
|             }
 | |
| 
 | |
|             NumRows.Value = totalrows;
 | |
|             NumCols.Value = totalcols;
 | |
|             IsInitializing = false;
 | |
|             setDataViewtoValues();
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //set the display cells to match the values in the datatable for initialization
 | |
|         //and resize of the dataviewgrid
 | |
|         void setDataViewtoValues()
 | |
|         {
 | |
|             if (!IsInitializing)
 | |
|             {
 | |
|                 for (int c = 0; c < totalcols; c++)
 | |
|                 {
 | |
|                     for (int rw = 0; rw < totalrows; rw++)
 | |
|                     {
 | |
|                         dataview.Rows[rw].Cells[c].Value = values.Rows[rw][c];
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //Get storage string for storing table values in db
 | |
|         // data will be returned in the format:
 | |
|         // totalnumrows,totalnumcols;(row,col):value|(row,col):value...
 | |
|         public string GetStorageValue()
 | |
|         {
 | |
|             //force any in progress editing to commit.
 | |
|             ((BindingSource)dataview.DataSource).EndEdit();
 | |
| 
 | |
|             StringBuilder bldr = new StringBuilder();
 | |
|             bldr.Append($"{totalrows},{totalcols}");
 | |
|             List<string> points = new List<string>();
 | |
|             for (int rw = 0; rw < values.Rows.Count; rw++)
 | |
|             {
 | |
|                 for (int col = 0; col < values.Columns.Count; col++)
 | |
|                 {
 | |
|                     if ((string) values.Rows[rw][col] != "none")
 | |
|                         points.Add($"({rw},{col}):{values.Rows[rw][col]}");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             if (points.Count > 0)
 | |
|             {
 | |
|                 bldr.Append(";");
 | |
|                 bldr.Append(string.Join("|", points));
 | |
|             }
 | |
| 
 | |
|             return bldr.ToString();
 | |
|         }
 | |
| 
 | |
|         private void NumRows_ValueChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             int endNumRows = (int)NumRows.Value;
 | |
|             int curNumRows = totalrows;
 | |
| 
 | |
|             //remove rows till equal
 | |
|             while (curNumRows > endNumRows)
 | |
|             {
 | |
|                 values.Rows.RemoveAt(curNumRows - 1);
 | |
|                 curNumRows--;
 | |
|             }
 | |
|             //add rows till equal
 | |
|             while (curNumRows < endNumRows)
 | |
|             {
 | |
|                 values.Rows.Add();
 | |
|                 curNumRows++;
 | |
|             }
 | |
| 
 | |
|             totalrows = endNumRows;
 | |
|             setDataViewtoValues();
 | |
|         }
 | |
| 
 | |
|         private void NumCols_ValueChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             int endNumCols = (int)NumCols.Value;
 | |
|             int curNumCols = totalcols;
 | |
| 
 | |
|             BindingSource bindingSourceDropDown = new BindingSource();
 | |
|             bindingSourceDropDown.DataSource = Enum.GetNames(typeof(EPinputtype));
 | |
| 
 | |
|             //remove cols till equal
 | |
|             while (curNumCols > endNumCols)
 | |
|             {
 | |
|                 values.Columns.RemoveAt(curNumCols - 1);
 | |
|                 dataview.Columns.RemoveAt(curNumCols - 1);
 | |
|                 curNumCols--;
 | |
|             }
 | |
|             //add cols till equal
 | |
|             while (curNumCols < endNumCols)
 | |
|             {
 | |
|                 values.Columns.Add(new DataColumn($"Column{curNumCols + 1}") { DefaultValue = "none"});
 | |
|                 if (dataview.Columns.Count > curNumCols) dataview.Columns.RemoveAt(curNumCols);
 | |
|                 var cName = new DataGridViewComboBoxColumn();
 | |
|                 cName.DataSource = bindingSourceDropDown;
 | |
|                 cName.DefaultCellStyle.NullValue = "none";
 | |
|                 dataview.Columns.Add(cName);
 | |
| 
 | |
|                 curNumCols++;
 | |
|             }
 | |
| 
 | |
|             totalcols = endNumCols;
 | |
|             setDataViewtoValues();
 | |
|         }
 | |
| 
 | |
|         //set the datatable value to match the changed datagridview value
 | |
|         //for some reason despite being bound, does not automatically update 
 | |
|         // (it may be that datatable as a bindingsource does not implement INotifyProperty
 | |
|         //  and thus needs manually set like this)
 | |
|         private void dataview_CellEndEdit(object sender, DataGridViewCellEventArgs e)
 | |
|         {
 | |
|             values.Rows[e.RowIndex][e.ColumnIndex] = (string) dataview.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |