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);
}
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方法
这个不是B/S程序
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个处理方法,以此类推
if(!Page.Ispostback){第一次加载时的内容}
这句话,页面再刷新的时候通常会产生重复提交或者将原来内容刷没了的现像。
/// 新增保存
/// </summary>
void SaveInsert()
{
CustomsCategoryRequest request = new CustomsCategoryRequest();
request.ActionMode = CustomsCategoryRequest.ActionType.Insert;
request.Category = this.m_Category; Response<bool> response = Rpc.Call<bool>(request);
if (response.IsDone)
{
if (response.Value)
{
CommonTools.ShowMsg("保存成功。");
}
else
{
CommonTools.ShowMsg("有重复的类别名,请确认");
this.bsCustomsCategoryList.RemoveCurrent();
return;
}
}
else
{
CommonTools.ShowError(response.Exception);
}
}
-----------
我在保存没有成功的时候会用(this.bsCustomsCategoryList.RemoveCurrent();)把刚才输入的内容移除,如果不加这句话,哪么程序是正常的,但是数据还会存在在列表中,数据库了没有,
顺便说下,我这是winform程序。