检测部分类中的DataRow更改

时间:2008-12-01 19:47:25

标签: c# ado.net dataset partial-classes

假设我有一个表示域对象的接口:

public interface IFoo
{
    Bar Bar { get; }
}

Bar类型是一系列对象,每个对象的架构略有不同。在数据库中,这表示为XML(这是一个移动应用程序,因此它只是nvarchar不是一个真正的XML列。)

我有一个生成的DataSet,其中包含FooDataTable和相应的FooRow个对象:

// AcmeDataSet.designer.cs

public partial class FooRow : DataRow
{
    public string BarXml
    {
        // Generated get and set
    }
}

我想实现IFoo并缓存Bar的反序列化实例:

// FooRow.cs

public partial class FooRow : IFoo
{
    private Bar _bar;

    Bar IFoo.Bar
    {
        get { return _bar; }
    }
}

如何从分部课中确定BarXml的值已发生变化?

我意识到FooDataTable包含ColumnChangingColumnChanged个事件,但我不知道如何订阅它们。没有类似于Linq到Sql的OnCreated部分方法,我不知道另一种方法来挂钩生成的构造函数。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,那么你的FooRow对象(实例)是从Type DataRow派生的某种类型的实例......如果是这样,那么由于DataRow有一个引用DataTable的属性,只需转换你的IFoo变量到DataRow,

FooRow内部

  public partial class FooRow
  {    
       private void myColumnChanging Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       private void myColumnChanged Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       public void RegisterEvents()
       {
          ((DataRow)this).Table.ColumnChanging += myColumnChanging; 
          ((DataRow)this).Table.ColumnChanged += myColumnChanged; 
       }
   }

然后,在FooDataTable类中,添加一个新的工厂方法MyNewFooRow()

public class FooDataTable 
{
    //  -- Other implementation
    public FooRow MyNewFooRow()
    {
        FooRow fr = this.NewFooRow(); // call the original factory
        fr.RegisterEvents();
        return fr;
    }
 }

并使用这个新工厂,无论你在哪里使用旧工厂......