AIMS/DrawGraph/Graph/DataSourcePointList.cs
2022-08-23 21:12:59 +08:00

299 lines
8.7 KiB
C#

//============================================================================
//DataSourcePointList Class
//Copyright ?2006 John Champion, Jerry Vos
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this library; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//=============================================================================
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms;
using System.Data;
namespace DrawGraph
{
/// <summary>
///
/// </summary>
/// <seealso cref="IPointList" />
/// <seealso cref="IPointListEdit" />
///
/// <author>John Champion</author>
/// <version> $Revision: 3.3 $ $Date: 2007/02/18 05:51:53 $ </version>
[Serializable]
public class DataSourcePointList : IPointList
{
private BindingSource _bindingSource;
//private object _dataSource = null;
private string _xDataMember = null;
private string _yDataMember = null;
private string _zDataMember = null;
private string _tagDataMember = null;
#region Properties
/// <summary>
/// Indexer to access the specified <see cref="PointPair"/> object by
/// its ordinal position in the list.
/// </summary>
/// <param name="index">The ordinal position (zero-based) of the
/// <see cref="PointPair"/> object to be accessed.</param>
/// <value>A <see cref="PointPair"/> object reference.</value>
public PointPair this[int index]
{
get
{
if ( index < 0 || index >= _bindingSource.Count )
throw new System.ArgumentOutOfRangeException( "Error: Index out of range" );
object row = _bindingSource[index];
double x = GetDouble( row, _xDataMember );
double y = GetDouble( row, _yDataMember );
double z = GetDouble( row, _zDataMember );
object tag = GetObject( row, _tagDataMember );
PointPair pt = new PointPair( x, y, z );
pt.Tag = tag;
return pt;
}
}
/// <summary>
/// gets the number of points available in the list
/// </summary>
public int Count
{
get
{
if ( _bindingSource != null )
return _bindingSource.Count;
else
return 0;
}
}
/// <summary>
/// The <see cref="BindingSource" /> object from which to get the bound data
/// </summary>
/// <remarks>
/// Typically, you set the <see cref="System.Windows.Forms.BindingSource.DataSource" />
/// property to a reference to your database, table or list object. The
/// <see cref="System.Windows.Forms.BindingSource.DataMember" /> property would be set
/// to the name of the datatable within the
/// <see cref="System.Windows.Forms.BindingSource.DataSource" />,
/// if applicable.</remarks>
public object BindingSource
{
get { return _bindingSource; }
}
/// <summary>
/// The table or list object from which to extract the data values.
/// </summary>
/// <remarks>
/// This property is just an alias for
/// <see cref="System.Windows.Forms.BindingSource.DataSource" />.
/// </remarks>
public object DataSource
{
get { return _bindingSource.DataSource; }
set { _bindingSource.DataSource = value; }
}
/// <summary>
/// The <see cref="string" /> name of the property or column from which to obtain the
/// X data values for the chart.
/// </summary>
/// <remarks>Set this to null leave the X data values set to <see cref="PointPairBase.Missing" />
/// </remarks>
public string XDataMember
{
get { return _xDataMember; }
set { _xDataMember = value; }
}
/// <summary>
/// The <see cref="string" /> name of the property or column from which to obtain the
/// Y data values for the chart.
/// </summary>
/// <remarks>Set this to null leave the Y data values set to <see cref="PointPairBase.Missing" />
/// </remarks>
public string YDataMember
{
get { return _yDataMember; }
set { _yDataMember = value; }
}
/// <summary>
/// The <see cref="string" /> name of the property or column from which to obtain the
/// Z data values for the chart.
/// </summary>
/// <remarks>Set this to null leave the Z data values set to <see cref="PointPairBase.Missing" />
/// </remarks>
public string ZDataMember
{
get { return _zDataMember; }
set { _zDataMember = value; }
}
/// <summary>
/// The <see cref="string" /> name of the property or column from which to obtain the
/// tag values for the chart.
/// </summary>
/// <remarks>Set this to null leave the tag values set to null. If this references string
/// data, then the tags may be used as tooltips using the
/// <see cref="ZedGraphControl.IsShowPointValues" /> option.
/// </remarks>
public string TagDataMember
{
get { return _tagDataMember; }
set { _tagDataMember = value; }
}
#endregion
#region Constructors
/// <summary>
/// Default Constructor
/// </summary>
public DataSourcePointList()
{
_bindingSource = new BindingSource();
_xDataMember = string.Empty;
_yDataMember = string.Empty;
_zDataMember = string.Empty;
_tagDataMember = string.Empty;
}
/// <summary>
/// Constructor to initialize the DataSourcePointList from an
/// existing <see cref="DataSourcePointList" />
/// </summary>
public DataSourcePointList( DataSourcePointList rhs ) : this()
{
_bindingSource.DataSource = rhs._bindingSource.DataSource;
if ( rhs._xDataMember != null )
_xDataMember = (string) rhs._xDataMember.Clone();
if ( rhs._yDataMember != null )
_yDataMember = (string)rhs._yDataMember.Clone();
if ( rhs._zDataMember != null )
_zDataMember = (string)rhs._zDataMember.Clone();
if ( rhs._tagDataMember != null )
_tagDataMember = (string)rhs._tagDataMember.Clone();
}
/// <summary>
/// Implement the <see cref="ICloneable" /> interface in a typesafe manner by just
/// calling the typed version of <see cref="Clone" />
/// </summary>
/// <returns>A deep copy of this object</returns>
object ICloneable.Clone()
{
return this.Clone();
}
/// <summary>
/// Typesafe, deep-copy clone method.
/// </summary>
/// <returns>A new, independent copy of this class</returns>
public DataSourcePointList Clone()
{
return new DataSourcePointList( this );
}
#endregion
#region Methods
/// <summary>
/// Extract a double value from the specified table row or data object with the
/// specified column name.
/// </summary>
/// <param name="row">The data object from which to extract the value</param>
/// <param name="dataMember">The property name or column name of the value
/// to be extracted</param>
private double GetDouble( object row, string dataMember )
{
if ( dataMember == null || dataMember == string.Empty )
return PointPair.Missing;
PropertyInfo pInfo = row.GetType().GetProperty( dataMember );
DataRowView drv = row as DataRowView;
object val = null;
if ( pInfo != null )
val = pInfo.GetValue( row, null );
else if ( drv != null )
val = drv[dataMember];
else if ( pInfo == null )
throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" );
// if ( val == null )
// throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" );
double x;
if ( val == null )
x = PointPair.Missing;
else if ( val.GetType() == typeof( DateTime ) )
x = ( (DateTime)val ).ToOADate();
else
x = Convert.ToDouble( val );
return x;
}
/// <summary>
/// Extract an object from the specified table row or data object with the
/// specified column name.
/// </summary>
/// <param name="row">The data object from which to extract the object</param>
/// <param name="dataMember">The property name or column name of the object
/// to be extracted</param>
private object GetObject( object row, string dataMember )
{
if ( dataMember == null || dataMember == string.Empty )
return null;
PropertyInfo pInfo = row.GetType().GetProperty( dataMember );
DataRowView drv = row as DataRowView;
object val = null;
if ( pInfo != null )
val = pInfo.GetValue( row, null );
else if ( drv != null )
val = drv[dataMember];
if ( val == null )
throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" );
return val;
}
#endregion
}
}