Click here to Skip to main content
15,881,204 members
Articles / Programming Languages / XML

Create Data Classes

Rate me:
Please Sign up or sign in to vote.
4.88/5 (31 votes)
4 Mar 2011CPOL10 min read 135.3K   2.5K   167  
An application that creates a C# class to read/write data to/from an Access, SQLite, or XML database.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace JGClassGenerator
{
	internal partial class FormListInput : FormBaseDialog
	{
		private Dictionary<int, JTypesData> m_DicDataTypes;

		private int m_ParentRecordNumber = 0;

		private JFieldsData m_WorkingFieldsData = null;

		internal delegate void GetFieldNamesListEventHandler(object sender, ref List<string> listFieldNames);
		internal event GetFieldNamesListEventHandler GetFieldNamesList;
		private void OnGetFieldsList(object sender, ref List<string> listFieldNames)
		{
			GetFieldNamesListEventHandler handler = GetFieldNamesList;
			if (handler != null)
				handler(sender, ref listFieldNames);
		}

		private void RaiseGetFieldsListEvent(object sender, ref List<string> listFieldNames)
		{
			OnGetFieldsList(sender, ref listFieldNames);
		}

		internal delegate void FieldDataChangedEventHandler(object sender, JFieldsData fieldData, bool isNew);
		internal event FieldDataChangedEventHandler FieldDataChanged;
		private void OnFieldDataChanged(object sender, JFieldsData fieldData, bool isNew)
		{
			FieldDataChangedEventHandler handler = FieldDataChanged;
			if (handler != null)
				handler(sender, fieldData, isNew);
		}

		private void RaiseFieldDataChanged(object sender, JFieldsData fieldData, bool isNew)
		{
			OnFieldDataChanged(sender, fieldData, isNew);
		}

		internal FormListInput(int parentRecordNumber)
		{
			InitializeComponent();
			this.ShowButtons = true;
			this.m_ParentRecordNumber = parentRecordNumber;
		}

		private void FormListInput_Load(object sender, EventArgs e)
		{
			ControlInitialise();
		}

		private void ControlInitialise()
		{
			ButtonOK.Visible = false;
			ButtonCancelText = "Finished";
			FillDbTypeCombo();
			ClearForm();
			this.m_DicDataTypes = JTypesUpdater.GetDataTypesMatrix();
			AddNewField(this.m_ParentRecordNumber);
		}

		internal void AddNewField(int parentRecordNumber)
		{
			ClearForm();
			this.m_ParentRecordNumber = parentRecordNumber;
			this.m_WorkingFieldsData = new JFieldsData();
			txtFieldLength.Enabled = false;
			ShowMessage("", false);
			cboDbType.Focus();
		}

		public void AutoComplete(ComboBox cb, System.Windows.Forms.KeyPressEventArgs e)
		{
			int searchIndex = -1;

			string searchString = "";

			if (e.KeyChar == '\t')
			{
				if (cb.SelectionStart <= 1)
				{
					cb.Text = "";
					return;
				}

				if (cb.SelectionLength == 0)
					searchString = cb.Text.Substring(0, cb.Text.Length - 1);
				else
					searchString = cb.Text.Substring(0, cb.SelectionStart - 1);
			}
			else
			{
				if (cb.SelectionLength == 0)
					searchString = cb.Text + e.KeyChar;
				else
					searchString = cb.Text.Substring(0, cb.SelectionStart) + e.KeyChar;
			}

			searchIndex = cb.FindString(searchString);

			if (searchIndex != -1)
			{
				cb.SelectedText = "";
				cb.SelectedIndex = searchIndex;
				cb.SelectionStart = searchString.Length;
				cb.SelectionLength = cb.Text.Length;
			}

			e.Handled = true;
		}


		private void cboDbType_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Escape)
			{
				cboDbType.SelectedIndex = -1;
			}
		}

		private void cboDbType_KeyPress(object sender, KeyPressEventArgs e)
		{
			AutoComplete(cboDbType, e);
		}

		private void cboDbType_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (cboDbType.SelectedIndex == -1)
				return;

			JTypesData.JTypesIndexData indexData = (JTypesData.JTypesIndexData)cboDbType.SelectedItem;
			JTypesData dataType = m_DicDataTypes[indexData.TypeID];
			lblTypeID.Text = indexData.TypeID.ToString();

			if (dataType.LengthRequired)
			{
				lblFieldLength.Enabled = true;
				txtFieldLength.Enabled = true;
			}
			else
			{
				lblFieldLength.Enabled = false;
				txtFieldLength.Enabled = false;
			}
		}

		private void ClearForm()
		{
			cboDbType.SelectedIndex = -1;
			cboDbType.Text = "";
			lblTypeID.Text = "0";
			txtFieldName.Text = "";
			txtFieldLength.Text = "";
		}

		private void FillDbTypeCombo()
		{
			cboDbType.Items.Clear();

			if (!string.IsNullOrEmpty(JCommon.ProgramDatabasePath))
			{
				List<JTypesData.JTypesIndexData> listIndex = JTypesUpdater.AllIndexData();
				cboDbType.Items.AddRange(listIndex.ToArray());
			}
		}

		private void GetRecordFromForm(JFieldsData fieldsData)
		{
			fieldsData.ParentRecordNumber = this.m_ParentRecordNumber;

			fieldsData.FieldName = Convert.ToString(txtFieldName.Text);
			fieldsData.TypeID = TypeID;
			try
			{
				fieldsData.FieldLength = Convert.ToInt32(txtFieldLength.Text);
			}
			catch
			{
				fieldsData.FieldLength = 0;
			}
		}

		private bool IsDataComplete()
		{
			int fieldLength = 0;

			if (TypeID < 1)
			{
				ShowMessage("Please Select Db Type", true);
				return false;
			}

			if (string.IsNullOrEmpty(txtFieldName.Text) || string.IsNullOrEmpty(cboDbType.Text))
			{
				ShowMessage("Field Name and Type Required", true);
				return false;
			}

			if (IsFieldNameDuplicated(txtFieldName.Text))
			{
				ShowMessage("Duplicate Variable Name : " + txtFieldName.Text, true);
				return false;
			}

			JTypesData dataType = m_DicDataTypes[TypeID];

			if (dataType.LengthRequired)
			{
				try
				{
					fieldLength = Convert.ToInt32(txtFieldLength.Text);
				}
				catch
				{
					fieldLength = 0;
				}
				if (fieldLength == 0)
				{
					ShowMessage("Field Length Required For " + cboDbType.Text, true);
					return false;
				}
			}

			return true;
		}

		private bool IsFieldNameDuplicated(string newName)
		{
			bool result = false;

			List<string> listFieldNames = new List<string>();
			RaiseGetFieldsListEvent(this, ref listFieldNames);

			foreach (string current in listFieldNames)
			{
				if (current == newName)
				{
					result = true;
					break;
				}
			}
			return result;
		}

		private int TypeID
		{
			get
			{
				try
				{
					return Convert.ToInt32(lblTypeID.Text);
				}
				catch
				{
					return 0;
				}
			}
		}

		private void txtFieldName_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Return)
			{
				e.SuppressKeyPress = true;
				if (SaveRecord())
					AddNewField(this.m_ParentRecordNumber);
			}
		}

		private void txtFieldLength_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Return)
			{
				e.SuppressKeyPress = true;
				if (SaveRecord())
					AddNewField(this.m_ParentRecordNumber);
			}
		}

		private bool SaveRecord()
		{
			if (IsDataComplete())
			{
				GetRecordFromForm(this.m_WorkingFieldsData);
				RaiseFieldDataChanged(this, this.m_WorkingFieldsData, true);
				return true;
			}
			return false;
		}



	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Retired
United Kingdom United Kingdom
I have been a keen hobbyist programmer since getting my first computer - a Vic 20 (you had to be able to write programs then since few programs were available and all were expensive).
Retired and now living in Pewsey, Wiltshire, where I spend (far too much of) my time writing computer programs to keep my mind active.

Comments and Discussions