public CellInfo(CellData cell_descr, MemberInfo column, MemberInfo row, IList<MemberInfo> invisibleCoords)
        {
            if (cell_descr == null)
            {
                throw new ArgumentNullException("cell_descr");
            }
            if (column == null)
            {
                throw new ArgumentNullException("column");
            }
            if (row == null)
            {
                throw new ArgumentNullException("row");
            }
            if (invisibleCoords == null)
            {
                throw new ArgumentNullException("invisibleCoords");
            }

            CellDescr = cell_descr;
            ColumnMember = column;
            RowMember = row;
            InvisibleCoords = invisibleCoords;
        }
        private void BuildDescription(CellSet cs)
        {
            if (cs != null)
            {
                if (cs.OlapInfo != null &&
                    cs.OlapInfo.CubeInfo != null &&
                    cs.OlapInfo.CubeInfo.Cubes != null &&
                    cs.OlapInfo.CubeInfo.Cubes.Count > 0)
                {
                    m_CellSet.CubeName = cs.OlapInfo.CubeInfo.Cubes[0].CubeName;
                }

                DateTime start = DateTime.Now;
                int i = 0;
                // Оси
                foreach(Axis axis in cs.Axes)
                {
                    AxisData axis_data = BuildAxisDescription(axis);
                    axis_data.AxisNum = i;
                    m_CellSet.Axes.Add(axis_data);
                    i++;
                }
                System.Diagnostics.Debug.WriteLine("CellSetData building AXES time: " + (DateTime.Now - start).ToString());

                // Ось фильтров - пока эта информация не нужна
                // cs_descr.FilterAxis = BuildAxisDescription(cs.FilterAxis); 

                DateTime start1 = DateTime.Now;
                if (cs.Axes.Count == 1)
                {
                    for (int col = 0; col < cs.Axes[0].Positions.Count; col++)
                    {
                        CellData cell_descr = new CellData();
                        cell_descr.Axis0_Coord = col;
                        cell_descr.Axis1_Coord = -1;
                        cell_descr.Value = GetValue(col);
                        m_CellSet.Cells.Add(cell_descr);
                    }
                }

                if (cs.Axes.Count >= 2)
                { 
                    for(int col = 0; col < cs.Axes[0].Positions.Count; col++)
                    {
                        for (int row = 0; row < cs.Axes[1].Positions.Count; row++)
                        {
                            CellData cell_descr = new CellData();
                            cell_descr.Axis0_Coord = col;
                            cell_descr.Axis1_Coord = row;
                            cell_descr.Value = GetValue(col, row);
                            m_CellSet.Cells.Add(cell_descr);
                        }
                    }
                }

                System.Diagnostics.Debug.WriteLine("CellSetData building CELLS time: " + (DateTime.Now - start1).ToString());
            }
        }
        // Пока информация о FilterAxis не нужна
        //AxisData m_FilterAxis = null;
        //public AxisData FilterAxis
        //{
        //    get { return m_FilterAxis; }
        //    set { m_FilterAxis = value; }
        //}

        public CellData GetCellDescription(int col)
        {
            //if (col >= 0)
            {
                foreach (CellData cell in Cells)
                {
                    if (cell.Axis0_Coord == col)
                    {
                        return cell;
                    }
                }
            }

            // Ячейка не найдена. Возможно это ячейка, которой не существует в кубе (null)
            // При некоторых настройках безопасности в CellSet есть мемберы а коллекция Cells пустая.
            var cell_empty = new CellData() { Axis0_Coord = col};
            return cell_empty;
        }
        internal void DeserializeData(string DataStr)
        {
            var cellDatas = Jayrock.Json.Conversion.JsonConvert.Import(DataStr) as JsonArray;
            var Values = cellDatas.GetArray(0);
            var DisplayValues = cellDatas.GetArray(1);
            var Styles = cellDatas.GetArray(2);
            int axes0Len = this.Axes.Count > 0 ? this.Axes[0].Positions.Count : 0;
            int axes1Len = this.Axes.Count > 1 ? this.Axes[1].Positions.Count : 0;
            var PropNames = cellDatas[cellDatas.Length - 1] as JsonArray;
            int CellOrdinal = 0;

            int cellsCount = Values.Count;
            for (int j = 0; j < cellsCount; j++)
            {
                var cellData = new CellData();
                cellData.Axis0_Coord = axes0Len > 0 ? j % axes0Len : -1;    // axes0Len может быть 0 и при этом будет одна ячейка (дефолтная). И осей при этом в CellSet нету.
                cellData.Axis1_Coord = axes1Len > 0 ? j / axes0Len : -1;
                var cellValueData = new CellValueData();
                var prop = new PropertyData("CellOrdinal", CellOrdinal);
                cellValueData.Properties.Add(prop);
                object val = ConvertFromJson(Values[CellOrdinal]);
                cellValueData.Value = val;
                prop = new PropertyData("VALUE", val);
                cellValueData.Properties.Add(prop);
                var props = cellDatas.GetArray(3 + Styles.GetInt32(CellOrdinal));
                string FORMAT_STRING = null;
                for (int k = 0; k < PropNames.Length; k++)
                {
                    var propName = PropNames[k].ToString();
                    //if (propName == "FORMAT_STRING")
                    //    FORMAT_STRING = (string)propval;
                    prop = new PropertyData(propName, ConvertFromJson(props[k]));
                    cellValueData.Properties.Add(prop);
                }

                //if (val == null)
                //    cellValueData.DisplayValue = null;
                //else if (FORMAT_STRING != null)
                //    cellValueData.DisplayValue = ((double)val).ToString(FORMAT_STRING);
                //else
                //    cellValueData.DisplayValue = val.ToString();
                cellValueData.DisplayValue = DisplayValues[CellOrdinal++].ToString();

                prop = new PropertyData("FORMATTED_VALUE", cellValueData.DisplayValue);
                cellValueData.Properties.Add(prop);
                cellData.Value = cellValueData;
                Cells.Add(cellData);
            }
        }
        public CellData GetCellDescription(int col, int row)
        {
            CellData cell = m_Cells2D[col, row];
            if (cell == null)
            {
                if (col >= 0 && row >= 0)
                {
                    foreach (CellData c in Cells)
                    {
                        if (c.Axis0_Coord == col &&
                            c.Axis1_Coord == row)
                        {
                            m_Cells2D.Add(c, col, row);
                            return c;
                        }
                    }
                }
            }

            if (cell == null)
            {
                // Ячейка не найдена. Возможно это ячейка, которой не существует в кубе (null)
                // При некоторых настройках безопасности в CellSet есть мемберы а коллекция Cells пустая.
                cell = new CellData() { Axis0_Coord = col, Axis1_Coord = row };
            }
            return cell;
        }