using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Collections; namespace FastReport.Data { /// /// Represents a datasource based on DataView class. /// /// /// This class is used to support FastReport.Net infrastructure, do not use it directly. /// If you want to use data from DataView object, call the /// method of the Report. /// public class ViewDataSource : DataSourceBase { #region Properties /// /// Gets the underlying DataView object. /// public DataView View { get { return Reference as DataView; } } #endregion #region Private Methods private Column CreateColumn(DataColumn column) { Column c = new Column(); c.Name = column.ColumnName; c.Alias = column.Caption; c.DataType = column.DataType; if (c.DataType == typeof(byte[])) c.BindableControl = ColumnBindableControl.Picture; else if (c.DataType == typeof(bool)) c.BindableControl = ColumnBindableControl.CheckBox; return c; } private void CreateColumns() { Columns.Clear(); if (View != null) { foreach (DataColumn column in View.Table.Columns) { Column c = CreateColumn(column); Columns.Add(c); } } } #endregion #region Protected Methods /// protected override object GetValue(Column column) { if (column == null) return null; if (column.Tag == null) column.Tag = View.Table.Columns.IndexOf(column.Name); return CurrentRow == null ? null : ((DataRowView)CurrentRow)[(int)column.Tag]; } #endregion #region Public Methods /// public override void InitSchema() { if (Columns.Count == 0) CreateColumns(); foreach (Column column in Columns) { column.Tag = null; } } /// public override void LoadData(ArrayList rows) { // custom load data via Load event OnLoad(); bool needReload = ForceLoadData || rows.Count == 0; if (needReload) { // fill rows rows.Clear(); for (int i = 0; i < View.Count; i++) { rows.Add(View[i]); } } } internal void RefreshColumns() { if (View != null) { // add new columns foreach (DataColumn column in View.Table.Columns) { if (Columns.FindByName(column.ColumnName) == null) { Column c = CreateColumn(column); c.Enabled = true; Columns.Add(c); } } // delete obsolete columns int i = 0; while (i < Columns.Count) { Column c = Columns[i]; if (!c.Calculated && !View.Table.Columns.Contains(c.Name)) c.Dispose(); else i++; } } } #endregion } }