Rows _Data;                                 // set dynamically when needed

        internal MatrixEntry(Row r, string hash, MatrixEntry p, int rowCount)
        {
            _r           = r;
            _hash        = hash;
            _HashData    = new Dictionary <string, MatrixEntry>();
            _ColumnGroup = null;
            _RowGroup    = null;
            _SortedData  = null;
            _Data        = null;
            _rowCount    = rowCount;
            _Rows        = null;
            _Parent      = p;
            _FirstRow    = -1;
            _LastRow     = -1;
        }
        internal RowGroupings(ReportDefn r, ReportLink p, XmlNode xNode) : base(r, p)
        {
            RowGrouping g;

            _Items = new List <RowGrouping>();
            // Loop thru all the child nodes
            foreach (XmlNode xNodeLoop in xNode.ChildNodes)
            {
                if (xNodeLoop.NodeType != XmlNodeType.Element)
                {
                    continue;
                }
                switch (xNodeLoop.Name)
                {
                case "RowGrouping":
                    g = new RowGrouping(r, this, xNodeLoop);
                    break;

                default:
                    g = null;                                   // don't know what this is
                    // don't know this element - log it
                    OwnerReport.rl.LogError(4, "Unknown RowGroupings element '" + xNodeLoop.Name + "' ignored.");
                    break;
                }
                if (g != null)
                {
                    _Items.Add(g);
                }
            }
            if (_Items.Count == 0)
            {
                OwnerReport.rl.LogError(8, "For RowGroupings at least one RowGrouping is required.");
            }
            else
            {
                _Items.TrimExcess();
                _StaticCount = GetStaticCount();
            }
        }