2013年03月04日

BindingSourceにListかList>を突っ込みたい。 その2

その2というか、修正版。
ちょっとあほなミスをしていたり、無駄なことをやっているところを微修正。
ちなみに、このRowsCollection(よく考えたらRowCollectionだよ orz)クラスは、DataGridViewでページングをしたいときに便利。
もちろんフィルタでも可。
いままで、DataTableを1ページ分ImportRowやって、ページングの前に書き戻ししてました。。。
我ながら、なんて無駄な。
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace TestDataTable
{
///
/// DataRowのコレクション
///

public class RowsCollection : BindingSource, ITypedList
{
#region メンバ
///
/// 対象カラム一覧
///

List ColumnNames { set; get; }

///
/// 初期化時にカラム情報を保持する
///

///
public RowsCollection(IEnumerable colNames)
{
this.ColumnNames = new List(colNames);
}

///
/// 初期化時にカラム情報を保持する
///

///
public RowsCollection(DataTable target)
{
this.ColumnNames = new List();
foreach(DataColumn col in target.Columns)
{
this.ColumnNames.Add(col.ColumnName);
}
}
#endregion

#region ITypedList の明示的実装
///
/// プロパティーへのアクセサ
///

///
///
PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)
{
PropertyDescriptor[] props = new PropertyDescriptor[this.ColumnNames.Count];
for (int i = 0; i < props.Length; i++)
{
props[i] = new ColumnDescriptor(this.ColumnNames[i]);
}
return new PropertyDescriptorCollection(props);
}

///
/// DataGrid用らしい
///

///
///
string ITypedList.GetListName(PropertyDescriptor[] listAccessors)
{
return string.Empty;
}
#endregion

#region Descriptor
///
/// メンバアクセス用
///

private class ColumnDescriptor : PropertyDescriptor
{
string columnName { set; get; }
///
/// 初期化時に対象のカラムへのアクセスができるように名前を保持しておく
///

///
public ColumnDescriptor(string colName) : base(colName, null)
{
this.columnName = colName;
}
///
/// 表示名はカラム名
///

public override string DisplayName
{
get { return this.columnName; }
}
///
/// DataRow
///

public override Type ComponentType
{
get { return typeof(DataRow); }
}
public override bool IsReadOnly { get { return false; } }
public override Type PropertyType { get { return typeof(object); } }
public override bool CanResetValue(object component)
{
return false;
}
public override void ResetValue(object component)
{
throw new NotSupportedException();
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
///
/// データ取得用
///

///
///
public override object GetValue(object component)
{
DataRow row = component as DataRow;
if (null == row) new NotSupportedException("Support type DataRow only");
return row[this.columnName];
}
///
/// データセット用
///

///
///
public override void SetValue(object component, object value)
{
DataRow row = component as DataRow;
if (null == row) new NotSupportedException("Support type DataRow only");
row[this.columnName] = value;
}
}
#endregion
}
}
posted by w033 at 19:37| 東京 ☁| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック