private void addNodeAsRow(ElementNode node, Row parentRow)
        {
            // made the new row from the given node and add it to the control.
            TimedSequenceRowLabel label = new TimedSequenceRowLabel();
            label.Name = node.Name;
            Row newRow = TimelineControl.AddRow(label, parentRow, 32);
            newRow.ElementRemoved += ElementRemovedFromRowHandler;
            newRow.ElementAdded += ElementAddedToRowHandler;

            // Tag it with the node it refers to, and take note of which row the given element node will refer to.
            newRow.Tag = node;
            if (_elementNodeToRows.ContainsKey(node))
                _elementNodeToRows[node].Add(newRow);
            else
                _elementNodeToRows[node] = new List<Row> { newRow };

            // This slows the load down just a little, but it
            // allows the update of the load timer on the bottom of the
            // screen so Vixen doesn't appear to be locked up for very large sequences
            if (doEventsCounter % 600 == 0)
                Application.DoEvents();
            doEventsCounter++;

            // iterate through all if its children, adding them as needed
            foreach (ElementNode child in node.Children)
            {
                addNodeAsRow(child, newRow);
            }
        }
        /// <summary>
        /// Adds a single given channel node as a row in the timeline control. Recursively adds all
        /// child nodes of the given node as children, if needed.
        /// </summary>
        /// <param name="node">The node to generate a row for.</param>
        /// <param name="parentRow">The parent node the row should belong to, if any.</param>
        private void addNodeAsRow(ChannelNode node, Row parentRow)
        {
            // made the new row from the given node and add it to the control.
            TimedSequenceRowLabel label = new TimedSequenceRowLabel();
            label.Name = node.Name;
            Row newRow = timelineControl.AddRow(label, parentRow, 32);
            newRow.ElementRemoved += ElementRemovedFromRowHandler;
            newRow.ElementAdded += ElementAddedToRowHandler;

            // Tag it with the node it refers to, and take note of which row the given channel node will refer to.
            newRow.Tag = node;
            if(_channelNodeToRows.ContainsKey(node))
                _channelNodeToRows[node].Add(newRow);
            else
                _channelNodeToRows[node] = new List<Row> {newRow};

            // iterate through all if its children, adding them as needed
            foreach(ChannelNode child in node.Children) {
                addNodeAsRow(child, newRow);
            }
        }