TypedDataTable (CodeProject)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TypedDataSet { class Program { static void Main(string[] args) { PersonTable table = new PersonTable(); table.PersonRowChanged += new PersonRowChangedDlgt(OnPersonRowChanged); PersonRow row = table.GetNewRow(); table.Add(row); } static void OnPersonRowChanged(PersonTable sender, PersonRowChangedEventArgs args) { // This is silly example only for the purposes of illustrating using typed events. // Do not do this in real applications, because you would never use this Changed event // to validate row fields! if (args.Row.LastName != String.Empty) { throw new ApplicationException("The row did not initialize to an empty string for the LastName field."); } } } }
using System; using System.Data; namespace TypedDataSet { public delegate void PersonRowChangedDlgt(PersonTable sender, PersonRowChangedEventArgs args); public class PersonTable : DataTable { public event PersonRowChangedDlgt PersonRowChanged; public PersonRow this[int idx] { get { return (PersonRow)Rows[idx]; } } public PersonTable() { Columns.Add(new DataColumn("LastName", typeof(string))); Columns.Add(new DataColumn("FirstName", typeof(string))); } public void Add(PersonRow row) { Rows.Add(row); } public void Remove(PersonRow row) { Rows.Remove(row); } public PersonRow GetNewRow() { PersonRow row = (PersonRow)NewRow(); return row; } protected override Type GetRowType() { return typeof(PersonRow); } protected override DataRow NewRowFromBuilder(DataRowBuilder builder) { return new PersonRow(builder); } protected override void OnRowChanged(DataRowChangeEventArgs e) { base.OnRowChanged(e); PersonRowChangedEventArgs args = new PersonRowChangedEventArgs(e.Action, (PersonRow)e.Row); OnPersonRowChanged(args); } protected virtual void OnPersonRowChanged(PersonRowChangedEventArgs args) { if (PersonRowChanged != null) { PersonRowChanged(this, args); } } } public class PersonRow : DataRow { public string LastName { get { return (string)base["LastName"]; } set { base["LastName"] = value; } } public string FirstName { get { return (string)base["FirstName"]; } set { base["FirstName"] = value; } } internal PersonRow(DataRowBuilder builder) : base(builder) { LastName = String.Empty; FirstName = String.Empty; } } public class PersonRowChangedEventArgs { protected DataRowAction action; protected PersonRow row; public DataRowAction Action { get { return action; } } public PersonRow Row { get { return row; } } public PersonRowChangedEventArgs(DataRowAction action, PersonRow row) { this.action = action; this.row = row; } } }
http://www.codeproject.com/Articles/30490/How-to-Manually-Create-a-Typed-DataTable

浙公网安备 33010602011771号