2012-01-16 98 views
2

我有一个ASP.Net的形式,我想,当用户更改他们的数据发送电子邮件。电子邮件应该只包含已更改的数据,并且总共有大约15个数据字段。监控ASP.Net表单上数据变化的最有效方法是什么?

我不想因为我更新该第三方为我们建造了一个网站,使用ORM,他们所有的数据访问的经历是他们的自定义库。

唯一的方法可以做到这一点,我能想到的是

  • 让另一个数据库调用来获取旧值和比较的形式值一个接一个。如果它们不同,请附加到电子邮件。

  • 存储原始数据的地方,当它第一次加载(隐藏场,会议等),并再次在同一时间一个字段比较数据和追加的差异来电子邮件

  • 有专人所以告诉我有一个更简单和/或更简单的方法,我都没有想到的

+0

难道只有你有ASP页面 - 或你有权访问他们使用的数据类吗?他们是否实现了INotifyProperty更改? – ChrisBD 2012-01-16 17:32:30

+0

@ChrisBD该网站如果很基本,并且不遵循任何特定的设计模式。数据被拖入“Object”或“DataSet”中,并手动应用于任何需要数据的控件。例如,'txtFirstName = myDataSet.Tables(0).Rows(0)(“FirstName”)'。这不是我喜欢做的东西的方法,但我不想重写整个网站,所以我们要按照他们已经设置的方式进行。 – Rachel 2012-01-16 17:37:30

+0

@Rachel - 你想让电子邮件包含原始的和新的值,或者你只需​​要知道一个字段*有*改变? – 2012-01-16 17:38:16

回答

2

所有文本框将有TextChanged事件,你可以让他们自己标记为已修改。 ComboBox的将有一个SelectedIndexChanged事件,依此类推。

编辑:一切都改变事件可以检查它们的初始值(即使在还原变化),要么将他们自己的还是修改或上复归,作为未修正。

+0

除非应该从列表中排除已还原的更改,在这种情况下,您仍然在查看从一个帖子到另一个帖子持久保存初始值。 – sq33G 2012-01-16 19:03:59

+0

所以你建议在每个文本框中插入一个'TextChanged'事件,并且在这种情况下,TextBox会在其自身上设置某种标志来表示它已被修改?这对我来说仍然没有多大帮助,因为我需要原始值以及更改后的值,而且看起来只会造成巨大的混乱。该电子邮件应该只在用户点击保存时触发,而不是在任何字段发生变化时触发。 – Rachel 2012-01-16 19:09:55

+0

是的,但您并未检查每个值是否有更改,只有那些发生更改的事件才会被触发。 – 2012-01-16 19:11:53

0

这里有一些建议,可以/不可以是有用的:在数据库表

  • 触发和触发比较旧的(使用DELETED表)和更新(使用插入表),然后发送一封电邮。这可能也可能不可行,我也不是触发器的主要倡导者。
  • 就像你已经说了,你可以让另一数据库调用,这将是我的reccommended方法。
0

从你说什么,我认为唯一的出路是创建窗体上的重复数据集存储旧数据并运行在要产生的电子邮件中的点进行比较。

您可以使用Dataset.Copy复制结构和数据。

但是,现在,我想它总是有Datset.GetChanges()方法及DataSet.HasChanges()

示例代码沿Dataset.AcceptChanges()从这个link

if(dataSet.HasChanges(DataRowState.Modified | 
     DataRowState.Added)&& dataSet.HasErrors) 
    { 
     // Use GetChanges to extract subset. 
     changesDataSet = dataSet.GetChanges(
      DataRowState.Modified|DataRowState.Added); 
     PrintValues(changesDataSet, "Subset values"); 

     // Insert code to reconcile errors. In this case, reject changes. 
     foreach(DataTable changesTable in changesDataSet.Tables) 
     { 
      if (changesTable.HasErrors) 
      { 
       foreach(DataRow changesRow in changesTable.Rows) 
       { 
        //Console.WriteLine(changesRow["Item"]); 
        if((int)changesRow["Item",DataRowVersion.Current ]> 100) 
        { 
         changesRow.RejectChanges(); 
         changesRow.ClearErrors(); 
        } 
       } 
      } 
     } 
     // Add a column to the changesDataSet. 
     changesDataSet.Tables["Items"].Columns.Add(
      new DataColumn("newColumn")); 
     PrintValues(changesDataSet, "Reconciled subset values"); 
     // Merge changes back to first DataSet. 
     dataSet.Merge(changesDataSet, false, 
      System.Data.MissingSchemaAction.Add); 
    } 
    PrintValues(dataSet, "Merged Values"); 
相关问题