日期:2014-05-18  浏览次数:20887 次

监视bindingsource数据变化的问题。
bsCustomsCategoryList 是bindingsource控件,
CustomsCategory 是实体类
不知道为什么老是插入两次数据,也就是件数数据变化的时候,会在保存成功以后在重新保存一次。

类别名不能有重复的,如果有重复的将不进行保存操作,而且会删除当前输入的记录(this.bsCustomsCategoryList.RemoveCurrent();),
-----------------------------------
代码:

  CustomsCategoryList m_Categorylist = new CustomsCategoryList();

  CustomsCategory m_Category = new CustomsCategory();

  //监视类别变化
  void bsCustomsCategoryList_CurrentChanged(object sender, EventArgs e)
  {
  CustomsCategory obj = this.bsCustomsCategoryList.Current as CustomsCategory;
  if (obj == null)
  return;

  obj.Changed -= new CustomsCategory.ChangedHandler(obj_Changed);
  obj.Changed += new CustomsCategory.ChangedHandler(obj_Changed);
  }

  //这段代码会执行两次。
  void obj_Changed(CustomsCategory src, CustomsCategory.EventFlag flag)
  {
  src.Changed -= this.obj_Changed;
  try
  {
  if (flag == CustomsCategory.EventFlag.FldCategoryName)
  {
  this.m_Category.CategoryName = src.CategoryName;
  this.m_Category.CategoryId = Guid.NewGuid().ToString();
  src.CategoryId = this.m_Category.CategoryId;
  //保存数据
  SaveInsert();  
  }
  }
  finally
  {
  src.Changed += this.obj_Changed;
  }
  }

  /// <summary>
  /// 数据绑定
  /// </summary>
  void BindUI()
  {
  bsCustomsCategoryList.DataSource = this.m_Categorylist;

  //监视类别变化
  this.bsCustomsCategoryList.CurrentChanged -= new EventHandler(bsCustomsCategoryList_CurrentChanged);
  this.bsCustomsCategoryList.CurrentChanged += new EventHandler(bsCustomsCategoryList_CurrentChanged);
  }

------解决方案--------------------
插入两次数据?
B/S程序的话 检查执行的那个页面的回传事件是否执行两次obj_Changed方法
 
------解决方案--------------------
变量名字命名很有问题:
src.Changed -= this.obj_Changed;
这里的obj_changed是一个new CustomsCategory.ChangedHandler(obj_Changed); 吧。。。。。

你说会执行两次,我怎么觉得情况没这么简单呢?

问题的关键在这里:
obj.Changed -= new CustomsCategory.ChangedHandler(obj_Changed);//毫无意义的代码
obj.Changed += new CustomsCategory.ChangedHandler(obj_Changed);//添加一个新的处理方法

这段代码每次都给obj添加一个ChangedHandler,而不会移除。
这样每次currentchange事件触发之后就会给curren所指的CustomsCategory实例(这里的obj)增加一个新的处理方法。而如果当current第二次指向同一个CustomsCategory实例实例之后,这个实例就被添加了2个处理方法,而第三次指向这个CustomsCategory实例实例的时候,这个实例就被添加3个处理方法,以此类推。。。




------解决方案--------------------
bs开发里面,如果在Page_onload事件里面没有加入
if(!Page.Ispostback){第一次加载时的内容}
这句话,页面再刷新的时候通常会产生重复提交或者将原来内容刷没了的现像。