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 

 

posted @ 2013-04-11 11:20  C#老头子  Views(170)  Comments(0)    收藏  举报