バージョン

IBindingList または IList へのバインディング

Chart コントロールをバインドできるデータ ソースのひとつが IBindingList です。IBindingList は、IList、ICollection、およびデータ連結をサポートする各メンバを提供する IEnumerable から派生したインタフェースです。IBindingList を実装するクラスの 1 例は、DataView です。

Chart を IBindingList にバインドするには、次の手順に従ってください。

Note

注: Chart コントロールを IList データ ソースにバインドするためにこの手順を使用することも可能です。

  1. 最初に、IBindingList に追加するクラスを必要とします。たとえば、Widget と呼ばれるクラスを使用します。

Visual Basic の場合:

Public Class Widget
    Public Sub New(ByVal name As String, ByVal marketValue As Double, ByVal magnitude As Long)
        Me.Name = name
        Me.MarketValue = marketValue
        Me.Magnitude = magnitude
    End Sub
    Private _name As String
    Private _marketValue As Double
    Private _magnitude As Long
    Public Property Name() As String
        Get
            Return Me._name
        End Get
        Set(ByVal Value As String)
            Me._name = Value
        End Set
    End Property
    Public Property MarketValue() As Double
        Get
            Return Me._marketValue
        End Get
        Set(ByVal Value As Double)
            Me._marketValue = Value
        End Set
    End Property
    Public Property Magnitude() As Long
        Get
            Return Me._magnitude
        End Get
        Set(ByVal Value As Long)
            Me._magnitude = Value
        End Set
    End Property
End Class

C# の場合:

/// <summary>
/// Widget クラス。
/// </summary>
public class Widget
{
	/// <summary>
	/// コンストラクタ
	/// </summary>
	/// <param name="name">名前</param>
	/// <param name="marketValue">Market 値</param>
	/// <param name="magnitude">Magnitude</param>
	public Widget(string name, double marketValue, long magnitude)
	{
		this.Name=name;
		this.MarketValue=marketValue;
		this.Magnitude=magnitude;
	}
	private string name;
	private double marketValue;
	private long magnitude;
	/// <summary>
	/// Public プロパティ名
	/// </summary>
	public string Name
	{
		get
		{
			return this.name;
		}
		set
		{
			this.name=value;
		}
	}
	/// <summary>
	/// Public プロパティ Market 値
	/// </summary>
	public double MarketValue
	{
		get
		{
			return this.marketValue;
		}
		set
		{
			this.marketValue=value;
		}
	}
	/// <summary>
	/// Public プロパティ Magnitude
	/// </summary>
	public long Magnitude
	{
		get
		{
			return this.magnitude;
		}
		set
		{
			this.magnitude=value;
		}
	}
}
  1. IBindingList を実装するクラスを作成します。このサンプルでは、以下のクラスを使用します。

Visual Basic の場合:

Public Class MyIBindingList
    Inherits CollectionBase
    Implements IBindingList
    Public Sub AddIndex(ByVal [property] As System.ComponentModel.PropertyDescriptor) Implements System.ComponentModel.IBindingList.AddIndex
    End Sub
    Public Function AddNew() As Object Implements System.ComponentModel.IBindingList.AddNew
        Return Me.AddNew("New Widget", 0, 0)
    End Function
    Public Function AddNew(ByVal name As String, ByVal marketValue As Double, ByVal magnitude As Long) As Widget
        Dim w As New Widget(name, marketValue, magnitude)
        Me.List.Add(w)
        Return w
    End Function
    Public Function Find(ByVal [property] As System.ComponentModel.PropertyDescriptor, ByVal key As Object) As Integer Implements System.ComponentModel.IBindingList.Find
	Return 0
    End Function
    Public Sub ApplySort(ByVal [property] As System.ComponentModel.PropertyDescriptor, ByVal direction As System.ComponentModel.ListSortDirection) Implements System.ComponentModel.IBindingList.ApplySort
    End Sub
    Public Sub RemoveSort() Implements System.ComponentModel.IBindingList.RemoveSort
    End Sub
    Public ReadOnly Property SupportsSorting() As Boolean Implements System.ComponentModel.IBindingList.SupportsSorting
        Get
		Return True
        End Get
    End Property
    Public Sub RemoveIndex(ByVal [property] As System.ComponentModel.PropertyDescriptor) Implements System.ComponentModel.IBindingList.RemoveIndex
    End Sub
    Public ReadOnly Property SupportsSearching() As Boolean Implements System.ComponentModel.IBindingList.SupportsSearching
        Get
		Return True
        End Get
    End Property
    Public ReadOnly Property SupportsChangeNotification() As Boolean Implements System.ComponentModel.IBindingList.SupportsChangeNotification
        Get
		Return True
        End Get
    End Property
    Public ReadOnly Property SortDirection() As System.ComponentModel.ListSortDirection Implements System.ComponentModel.IBindingList.SortDirection
        Get
		Return New System.ComponentModel.ListSortDirection()
        End Get
    End Property
    Public ReadOnly Property SortProperty() As System.ComponentModel.PropertyDescriptor Implements System.ComponentModel.IBindingList.SortProperty
        Get
		Return Nothing
        End Get
    End Property
    Public ReadOnly Property IsSorted() As Boolean Implements System.ComponentModel.IBindingList.IsSorted
        Get
		Return True
        End Get
    End Property
    Public ReadOnly Property AllowNew() As Boolean Implements System.ComponentModel.IBindingList.AllowNew
        Get
		Return True
        End Get
    End Property
    Public ReadOnly Property AllowEdit() As Boolean Implements System.ComponentModel.IBindingList.AllowEdit
        Get
		Return True
        End Get
    End Property
    Public ReadOnly Property AllowRemove() As Boolean Implements System.ComponentModel.IBindingList.AllowRemove
        Get
		Return True
        End Get
    End Property
    Public Event ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Implements System.ComponentModel.IBindingList.ListChanged
    Default Public ReadOnly Property Item(ByVal index As Integer) As Widget
        Get
            Return CType(Me.List(index), Widget)
        End Get
    End Property
End Class

C# の場合:

/// <summary>
/// カスタム コレクション
/// </summary>
public class MyIBindingList : CollectionBase, IBindingList
{
	/// <summary>
	/// コンストラクタ
	/// </summary>
	public MyIBindingList()
	{
	}
	/// <summary>
	/// 新しいインデックスを追加します。
	/// </summary>
	/// <param name="property">Provides an abstraction of a property on a class.</param>
	public void AddIndex(System.ComponentModel.PropertyDescriptor property)
	{
	}
	/// <summary>
	/// リストに新しい項目を追加します。
	/// </summary>
	/// <returns>新しい項目</returns>
	public object AddNew()
	{
		return this.AddNew("New Widget", 0, 0);
	}
	/// <summary>
	/// リストに新しい項目を追加します。
	/// </summary>
	/// <param name="name">名前</param>
	/// <param name="marketValue">Market 値</param>
	/// <param name="magnitude">Magnitude</param>
	/// <returns>Widget</returns>
	public Widget AddNew(string name, double marketValue, long magnitude)
	{
		Widget w = new Widget(name, marketValue, magnitude);
		this.List.Add(w);
		return w;
	}
	/// <summary>
	/// リスト内の項目を更新できるかどうかを取得します。
	/// </summary>
	public bool AllowEdit
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// AddNew を使用して項目をリストに追加できるかどうかを取得します。
	/// </summary>
	public bool AllowNew
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// Remove または RemoveAt を使用して、リストから項目を削除できるかどうかを取得します。
	/// </summary>
	public bool AllowRemove
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// PropertyDescriptor または ListSortDirection に基づいてリストをソートします。
	/// </summary>
	/// <param name="property">ソートする PropertyDescriptor。</param>
	/// <param name="direction">ListSortDirection 値のひとつ。</param>
	public void ApplySort(System.ComponentModel.PropertyDescriptor property, System.ComponentModel.ListSortDirection direction)
	{
	}
	/// <summary>
	/// 特定の PropertyDescriptor を持っている行のインデックスを返します。
	/// </summary>
	/// <param name="property">検索する PropertyDescriptor。</param>
	/// <param name="key">検索するプロパティ パラメータの値。</param>
	/// <returns>特定の PropertyDescriptor を持っている行のインデックスを返します。</returns>
	public int Find(System.ComponentModel.PropertyDescriptor property, object key)
	{
		return 0;
	}
	/// <summary>
	/// リスト内の項目がソートされるかどうかを取得します。
	/// </summary>
	public bool IsSorted
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// IBindingList クラスの ListChanged イベントを処理するメソッドを表します。
	/// </summary>
	public event System.ComponentModel.ListChangedEventHandler ListChanged;
	/// <summary>
	/// 検索するために使用されるインデックスから PropertyDescriptor を削除します。
	/// </summary>
	/// <param name="property">検索のために使用されるインデックスから削除する PropertyDescriptor。</param>
	public void RemoveIndex(System.ComponentModel.PropertyDescriptor property)
	{
	}
	/// <summary>
	/// ApplySort を使用して適用されるソートを削除します。
	/// </summary>
	public void RemoveSort()
	{
	}
	/// <summary>
	/// ソートの方向を取得します。
	/// </summary>
	public System.ComponentModel.ListSortDirection SortDirection
	{
		get
		{
			return new System.ComponentModel.ListSortDirection();
		}
	}
	/// <summary>
	/// ソートするために使用されている PropertyDescriptor を取得します。
	/// </summary>
	public System.ComponentModel.PropertyDescriptor SortProperty
	{
		get
		{
			return null;
		}
	}
	/// <summary>
	/// リストが変更するまたはリスト内の項目が変更する時に ListChanged イベント
	/// が発生するかどうかを取得します。
	/// </summary>
	public bool SupportsChangeNotification
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// Find メソッドを使用して、リストが検索をサポートするかどうかを取得します。
	/// </summary>
	public bool SupportsSearching
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// リストがソートをサポートするかどうかを取得します。
	/// </summary>
	public bool SupportsSorting
	{
		get
		{
			return true;
		}
	}
	/// <summary>
	/// 位置またはキーのいずれかによって Collection オブジェクトの特定のメンバを返します。
	/// </summary>
	public Widget this[int index]
	{
		get
		{
			return this.List[index] as Widget;
		}
		set
		{
			this.List[index] = value;
		}
	}
}
  1. 上記のクラスを作成したら、以下の方法でインスタンス化する必要があります。作成された MyIBindingList のインスタンスに Chart コントロールをバインドします。

Visual Basic の場合:

Private Sub Binding_to_IBindingList_or_IList_Load(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles MyBase.Load
	Dim iBL As New MyIBindingList()
	iBL.AddNew("Average Widget", 700.15, 300)
	iBL.AddNew("Super Widget", 1500.7, 432)
	iBL.AddNew("Super Fantastic Widget", 1700.5, 500)
	iBL.AddNew("Messiah Widget", 2000.0, 600)
	Me.UltraChart1.Data.DataSource = iBL
End Sub

C# の場合:

private void Binding_to_IBindingList_or_IList_Load(object sender, EventArgs e)
{
	MyIBindingList iBL = new MyIBindingList();
	iBL.AddNew("Average Widget", 700.15, 300);
	iBL.AddNew("Super Widget", 1500.7, 432);
	iBL.AddNew("Super Fantastic Widget", 1700.5, 500);
	iBL.AddNew("Messiah Widget", 2000.00, 600);
	this.ultraChart1.Data.DataSource = iBL;
}