/// <summary>
        /// Sort elements by name and display them in the data grid view
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCharSymbols_Click(object sender, EventArgs e)
        {
            var finalElements = from q in PeriodicTable.GetAllElements()
                                orderby q.Symbol
                                select q;

            //Show data
            binder.DataSource = finalElements;
        }
        /// <summary>
        /// Sort elements by Atomic mass and display them in the data grid view
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSortAtomic_Click(object sender, EventArgs e)
        {
            var finalElements = from q in PeriodicTable.GetAllElements()
                                orderby q.AtomicMass
                                select q;

            //Show data
            binder.DataSource = finalElements;
        }
 /// <summary>
 /// Default blank display
 /// </summary>
 private void Blank()
 {
     UI_btnCharSymbols.Enabled     = true;
     UI_btnSortAtomic.Enabled      = true;
     UI_btnSortName.Enabled        = true;
     binder.DataSource             = PeriodicTable.GetAllElements();
     UI_labelFeedback.Text         = "";
     UI_txbxMolarMassOut.Text      = "Enter formula";
     UI_txbxMolarMassOut.ForeColor = Color.Black;
 }
        //Process input string to dictionary keyed by element, value is total count
        public Dictionary <Element, int> GetElements()
        {
            Dictionary <Element, int> elementCount = new Dictionary <Element, int>();

            /*
             * Split string into valid matches including:
             *      -Must have upper case letter
             *      -Optional lower case letter
             *      -Optional number
             *      -Optional two digit number
             */
            var segments = from n in Regex.Split(sRawInput, @"([A-Z][a-z]\d+)|([A-Z][a-z])|([A-Z]\d+)|([A-Z])")
                           where !n.Length.Equals(0)
                           select n;

            //Process valid matches into their separate parts using regular expressions, if there is no number then then count is 1, create groups based on unique string identifiers
            var rawGrouping = from q in segments
                              select new { Symbol = Regex.Match(q, @"([A-Z][a-z]|[A-Z])").Value, Count = string.IsNullOrEmpty(Regex.Match(q, @"\d+").Value) ? 1 : int.Parse(Regex.Match(q, @"\d+").Value) }
            into r group r by r.Symbol;

            sValid.Clear();
            sInvalid.Clear();
            foreach (var selection in rawGrouping)
            {
                //Only build the dictionary from valid elements
                if (PeriodicTable.ElementExists(selection.Key))
                {
                    sValid.Add(selection.Key);
                    int sum = 0;
                    //Add up the sums of each subgrouping
                    foreach (var item in selection)
                    {
                        sum += item.Count;
                    }
                    elementCount.Add(PeriodicTable.GetElement(selection.Key), sum);
                }
                else
                {
                    sInvalid.Add(selection.Key);
                }
            }
            return(elementCount);
        }