private void RenderOneRow(HtmlTextWriter writer, IEnumerable <string> query) { MatrixField mf = (MatrixField)this.ContainingField; int colSpan = 0; string prevGroupText = null; bool bFirst = true; foreach (var groupText in query) { if (bFirst) { prevGroupText = groupText; colSpan = 1; bFirst = false; } else if (groupText == prevGroupText) { ++colSpan; } else { // Render previous group RenderTh(writer, mf, colSpan, prevGroupText); colSpan = 1; prevGroupText = groupText; } } if (!bFirst) { // Render last group RenderTh(writer, mf, colSpan, prevGroupText); } }
internal MatrixDisplayColumn(MatrixField mf, MatrixColumn col, int colIndex) { _mf = mf; _mc = col; _colIndex = colIndex; ConditionalFormatter formatter = mf.GetHeaderFormatter(colIndex); _columnHeaderText = string.Format(formatter, col.DataHeaderFormatString, this.DataHeaderValues); this.Visible = string.IsNullOrEmpty(col.VisibleExpression) || formatter.Matches(col.VisibleExpression); _mainSortText = string.IsNullOrWhiteSpace(mf.SortExpression) ? string.Empty : string.Format(formatter, mf.SortExpression, this.DataHeaderValues); switch (col.ColumnType) { case MatrixColumnType.RowTotal: _mainHeaderText = _mf.RowTotalHeaderText; break; case MatrixColumnType.CellValue: _mainHeaderText = string.Format(formatter, _mf.HeaderText.Split('|')[0], this.DataHeaderValues); break; default: break; } _columnTotals = new decimal?[mf.DataCellFields.Length]; _colTotalindexes = mf.DataCellFields .Select((p, i) => this.MatrixColumn.ColumnTotalFormatString.Contains("{" + i.ToString()) ? i : -1) .Where(p => p >= 0).ToArray(); }
/// <summary> /// Create the <see cref="MatrixCell"/> controls. Also instantiate the item template if it exists /// </summary> /// <param name="e"></param> protected override void OnInit(EventArgs e) { MatrixField mf = (MatrixField)this.ContainingField; foreach (var dc in mf.DisplayColumns) { MatrixCell mc = new MatrixCell(dc); mc.MergeStyle(this.ContainingField.ItemStyle); this.Controls.Add(mc); } mf.DisplayColumns.CollectionChanged += DisplayColumns_CollectionChanged; base.OnInit(e); }
private void DoRenderSubtotals(MatrixCell mc, int firstRowIndex, int lastRowIndex) { GridView gv = (GridView)this.NamingContainer.NamingContainer; decimal?[] subtotals = new decimal?[mc.CellValues.Length]; IEnumerable <object[]> query = gv.Rows.Cast <GridViewRow>() .Skip(firstRowIndex).Take(lastRowIndex - firstRowIndex + 1) .SelectMany(p => p.Cells.OfType <MatrixRow>()) .SelectMany(p => p.MatrixCells) .Where(p => object.ReferenceEquals(p.DisplayColumn, mc.DisplayColumn)) .Select(p => p.CellValues); /* * foreach (int i in _mf.DataCellFields * .Select((p, i) => _colTotalindexes.Contains(i) ? i : -1) * .Where(p => p >= 0)) * { * if (values[i] != DBNull.Value) * { * _columnTotals[i] = (_columnTotals[i] ?? 0) + Convert.ToDecimal(values[i]); * } * * } */ MatrixField mf = (MatrixField)this.ContainingField; foreach (var values in query) { if (values != null) { foreach (int i in mf.DataCellFields .Select((p, i) => mc.DisplayColumn.FieldsToTotal.Contains(i) ? i : -1) .Where(p => p >= 0)) { if (values[i] != DBNull.Value) { subtotals[i] = (subtotals[i] ?? 0) + Convert.ToDecimal(values[i]); } } //for (int i = 0; i < subtotals.Length; ++i) //{ // if (values[i] != DBNull.Value) // { // subtotals[i] = (subtotals[i] ?? 0) + Convert.ToDecimal(values[i]); // } //} } } mc.Text = string.Format(mc.DisplayColumn.MatrixColumn.ColumnTotalFormatString, subtotals.Cast <object>().ToArray()); }
/// <summary> /// /// </summary> /// <param name="writer"></param> /// <exception cref="NotImplementedException"></exception> protected override void Render(HtmlTextWriter writer) { MatrixField mf = (MatrixField)this.ContainingField; if (mf.DisplayColumns.Count == 0) { // We have no columns to show. Do nothing return; } GridViewRow row = (GridViewRow)this.NamingContainer; IEnumerable <string> headers; switch (this.RowToRender ?? row.RowIndex) { case GridViewExHeaderRow.ROW_FIRST_LINE_HEADER: headers = from dc in mf.DisplayColumns where dc.Visible orderby dc select mf.GroupByColumnHeaderText ? dc.ColumnHeaderText : dc.MainHeaderText; //var query1 = mf.DisplayColumns.Where(p=> p.Visible) // .OrderBy(p => p) // .Select(p => mf.GroupByColumnHeaderText ? p.ColumnHeaderText : p.MainHeaderText); RenderOneRow(writer, headers); break; case GridViewExHeaderRow.ROW_SECOND_LINE_HEADER: case GridViewExHeaderRow.ROW_SINGLE_LINE_HEADER: // This is the second header row // ROW_SINGLE_LINE_HEADER is received only when we are exporting to Excel headers = from dc in mf.DisplayColumns where dc.Visible orderby dc select mf.GroupByColumnHeaderText ? dc.MainHeaderText : dc.ColumnHeaderText; //var query2 = mf.DisplayColumns.Where(p => p.Visible) // .OrderBy(p => p) // .Select(p => mf.GroupByColumnHeaderText ? p.MainHeaderText : p.ColumnHeaderText); RenderOneRow(writer, headers); break; //case GridViewExHeaderRow.ROW_SINGLE_LINE_HEADER: // throw new NotImplementedException("Not Possible"); default: throw new NotImplementedException("Will this happen ?"); } }
protected override void Render(HtmlTextWriter writer) { MatrixField mf = (MatrixField)this.ContainingField; if (mf.DisplayColumns.Count == 0) { // We have no columns to show. Do nothing return; } var query = from mc in this.MatrixCells where mc.Visible orderby mc.DisplayColumn select mc; foreach (var mc in query) { mc.RenderControl(writer); } }
private static void RenderTh(HtmlTextWriter writer, MatrixField mf, int colSpan, string text) { mf.HeaderStyle.AddAttributesToRender(writer); if (colSpan > 1) { writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString()); } writer.RenderBeginTag(HtmlTextWriterTag.Th); if (string.IsNullOrWhiteSpace(text)) { // Make this a 0 height cell writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "0"); } else { writer.Write(text); } writer.RenderEndTag(); }
public override void DataBind() { MatrixRow mr = (MatrixRow)this.Parent; MatrixField mf = (MatrixField)mr.ContainingField; Dictionary <string, object> dict = new Dictionary <string, object>(StringComparer.CurrentCultureIgnoreCase); // Grid Row data item fields. Their values will get overwritten with more specific values below // By returning these properties, we enable ItemTemplate to Eval row fields as well. GridViewRow gridRow = (GridViewRow)this.NamingContainer; ICustomTypeDescriptor custom = gridRow.DataItem as ICustomTypeDescriptor; if (custom != null) { // Only add those properties which have not already been added foreach (KeyValuePair <string, object> kvp in custom.GetProperties().Cast <PropertyDescriptor>() .Select(p => new KeyValuePair <string, object>(p.Name, p.GetValue(custom)))) { dict[kvp.Key] = kvp.Value; } } // Header fields for (int i = 0; i < mf.DataHeaderFields.Length; ++i) { dict[mf.DataHeaderFields[i]] = _dc.DataHeaderValues[i]; } // Value fields string formatString; switch (gridRow.RowType) { case DataControlRowType.DataRow: switch (_dc.MatrixColumn.ColumnType) { case MatrixColumnType.CellValue: bool b = mf.CurCellValues.TryGetValue(_dc.DataHeaderValueIndex, out _values); if (b) { if (_dc.MatrixColumn.DisplayColumnTotal) { _dc.UpdateColumnTotals(_values); } } else { _values = new object[mf.DataCellFields.Length]; } break; case MatrixColumnType.RowTotal: int[] rowTotalindexes = mf.DataCellFields .Select((p, i) => _dc.MatrixColumn.DataCellFormatString.Contains("{" + i.ToString()) ? i : -1) .Where(p => p >= 0).ToArray(); var query = from i in Enumerable.Range(0, mf.DataHeaderValues.Count) where mf.CurCellValues.ContainsKey(i) select mf.CurCellValues[i]; decimal?[] rowTotals = new decimal?[mf.DataCellFields.Length]; foreach (object[] val in query) { foreach (int index in rowTotalindexes) { if (!Convert.IsDBNull(val[index])) { decimal d = Convert.ToDecimal(val[index]); rowTotals[index] = (rowTotals[index] ?? 0) + d; } } } _values = rowTotals.Cast <object>().ToArray(); if (_dc.MatrixColumn.DisplayColumnTotal) { _dc.UpdateColumnTotals(_values); } break; default: throw new NotImplementedException(); } if (_dc.MatrixColumn.ItemTemplate == null) { formatString = this.DisplayColumn.MatrixColumn.DataCellFormatString; } else { formatString = null; } break; case DataControlRowType.Footer: _values = _dc.ColumnTotal.Cast <object>().ToArray(); formatString = this.DisplayColumn.MatrixColumn.ColumnTotalFormatString; break; default: throw new NotImplementedException(); } for (int i = 0; i < mf.DataCellFields.Length; ++i) { dict[mf.DataCellFields[i]] = _values[i]; } _coll = new PropertyDescriptorCollection( dict.Select(p => new KeyValuePropertyDescriptor(p.Key, p.Value)).ToArray() ); if (!string.IsNullOrEmpty(formatString)) { // This means that no template has been specified try { this.Text = string.Format(formatString, _values); } catch (FormatException) { // Show diagnostic string msg = string.Format("Format string: {0}; Cell Fields: {1}", formatString, string.Join(", ", mf.DataCellFields)); throw new FormatException(msg); } } base.DataBind(); // Save memory. Coll is no longer needed // Sharad 15 Jun 2011: _coll cannot be made null because app code might be needing it // during the RowDataBound event of the grid. //_coll = null; }
public MatrixRow(MatrixField containingField) : base(containingField) { }
public MatrixHeaderRow(MatrixField field) : base(field) { //this.RowToRender = GridViewExHeaderRow.ROW_FIRST_LINE_HEADER; }