前言:
在学习ASP.NET2.0的时候发现在操作数据的时候微软给我们提供了几个数据源控件.
然而每个控件也有各自的优缺点.比如说SqlDataSource使用起来方便.
可是在我们做项目中时常要将项目分层次来进行开发.于是我很少用到SqlDataSource,那么就开始关注ObjectDataSource了.
但是在使用的时候发现有很多问题.到网上查找确没有一些很好的答案,问到多数的前辈大部分都是说从来不用这个东西.^_^
其实按照以前的写法我也可以不用.但是出于研究的目的于是乎自己弄的试了试.那下面的内容就是在学习中遇到的问题并找到解决的答案,如果你也在学习这个ObjectDataSource那么你可以看看我解决的方式和你的方式有什么区别.有了好的可一定要告我.
注:这里主要是为了探讨和ObjectDataSource配合使用.验证啊样式啊什么的不在讨论的范围之内.^_^
^_^终于我们把GridView和ObjectDataSource配合弄好了.想怎么删除就删除,想怎么修改就怎么修改.结果当我删除完以后.哦哦哦.没录入啊.这可不行.总不能到数据库那里录入吧.恩.这样吧配合ObjectDataSource实现录入一定的弄出来.
先做个界面
哦.那添加的那个界面是不是需要像以前那样弄个表格呢?那样还有什么意思啊.
这里我用的是
这里的第一个DetailsView
不过默认的时候是读取的样子.那怎么弄呢.
设置这个属性到Insert
这样就和我上面一样了.
下一步你就可以把你的DetailsView绑定到和GridView相关联的ObjectDataSource上了.因为我们前面已经搞定了Insert的方法所以这里就直接可以使用了.
http://www.cnblogs.com/Lileltp/archive/2008/09/05/1285180.html
同理你也可以使用FormView来实现我们这里的录入内容
通过前两次的内容我们已经实现了带有分页和排序的显示数据,那么我们如何用ObjectDataSource来帮助我们实现删改
还是老办法我们先实现DAL层和BLL层当中的操作数据的方法
[DataObjectMethod(DataObjectMethodType.Insert)]
public static void InserUserInfo(UserInfo info)
{
DAL.UserInfoDAL.InsertUserInfo(info);
}
[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateUserInfo(UserInfo info)
{
DAL.UserInfoDAL.UpdateUserInfo(info);
}
[DataObjectMethod(DataObjectMethodType.Delete)]
public static void DeleteUserInfo(UserInfo info)
{
DAL.UserInfoDAL.DeleteUserInfo(info);
}
这里我们可以发现我这里传递的都是UserInfo对象了.至于好处嘛,我认为你在赋值的时候通过属性对其处理安全性更好一些.反正我总觉得比传一大堆的变量过来要好.所以这里采用这个方式.
如果你要采用我这种方式那么就需要注意你的ObjectDataSource中的一个属性是否正确设置了
这里我设置为我查询出的对象UserInfo
这样你就可以来实现删除和修改了.有些人就问呀!我没有像以前那样设置传递的参数啊.^_^
这里当你设置了ObjectDataSource的DataObjectTypeName,当你执行相关操作的时候ObjectDataSource就会自动生成一个你设置的对象并且将行内的值一一对应的传入到你的这个对象.然后直接将这个对象传入到你的BLL中的方法.但是要注意,这里还是有很多陷阱的
第一个陷阱 由数据冲突引起的问题
在ObjectDataSource中有个属性↑
这里属性来设置如何处理是否新旧值一起处理
MSDN上的描述为:获取或设置一个值,该值确定是仅将新值传递给 Update 方法,还是将旧值和新值都传递给 Update 方法。
当这里使用默认的OverwriteChanges的时候传递的值内容为你更改后值.这里传递是我们修改后的对象值.所以默认状态下你的更新是没有问题的.
但如果你要处理新旧值的时候就需要设置到CompareAllValues.但是这时你再更新数据的时候就会报错了.
为什么会这样呢?原来当你设置为CompareAllValues的时候他需要给你BLL层传递过两个对象,一个是原来的UserInfo一个是你修改后的Userinfo.
所以你的方法需要改成这样
[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateUserInfo(UserInfo info,UserInfo original_info)
{
......
}
这里发现我们的更新方法多了后面的一个参数叫original_info,这样才能将我们的修改后的内容正确更新回数据库,而且这里的original_这个前缀可以通过修改
来实现.
陷阱二,键字段的问题.
那当我们ConflicDetection使用默认的OverwriteChanges值的时候我们进行删除操作.发现没有删除了我们想要操作的那条记录.然后通过监视可以发现传递到BLL中的UserInfo对象虽不为空.但是里面属性的值都为默认值
那为什么会出现这个问题呢?我认为是,删除操作并没有修改我GridView中的记录所以在ConflicDetection使用默认的OverwriteChanges值的时候传递过的对象里要是有值只能是修改后的值.所以这里你要通过id来删除则只能删除记录为0的了.^_^
所以通常来说删除不了你想要的内容,但是不出错.
那怎么办呢?这里因为我们使用的是集合所以在编写GridView的时候少设置了一个属性,那就是
这里我们添加上键字段id.再来看看效果
这次发现,虽然这里没有吧UserInfo对象完整的传递过来.但是我们想要的id值过来了.^_^
接上回书说,我们实现了基本的显示和排序.那么今天就来做做查询和分页.
首先先做通过传递普通参数的形式来实现条件查询的.这里仅仅做个演示.
我们要通条件查询那就需要修改我们原来的查询方法了.
[DataObjectMethod(DataObjectMethodType.Select)]
public static List<UserInfo> GetUserInfoList(string name, string sort)
{
........
}
我们这里加了一个参数用来传入要查询的用户名称.
但是这里一定要注意.当你修改了后面的方法后一定要做一件事情.
那就是配置数据源
因为我们修改后面的方法参数所以这里也变化了如果不重新配置数据源就会报一个错误那就是
当你重新配置数据源的时候就可以给你的参数设置值的来源了
这里我给name参数设置了值的来源为控件类型.控件名为txt_name,这样你就可以通过传递的值来改变你返回集合的内容了.而且这里因为我们指定数据来源是txt_name所以当你点击查询按钮的时候,他会自动重新绑定GridView控件.也就是你不必再执行GridView的DataBind方法了
上面已经实现了一点点效果了那最后就实现我们这次要最终想要的结果吧.
在传递值的时候会发现如果传递多个查询条件的时候参数还是比较多的.而且我们本来是有那个UserInfo类的,那我们干脆把要查询的条件内容放到一个对象里传过来好了,那样还能通过他的属性Set方法来验证一下.
public static List<UserInfo> GetUserInfoList(UserInfo info,int start,int max, string sort)
{
......
}
那么我们捎带的就把分页也做了吧.
根据我们的要求就把原来的方法改写成↑这样的了.传递了一个对象和分页的两个参数
在这里我们可以和上次说到的排序那样来在ObjectDataSource中设置这两个参数他们分别是
StartRowParameterName和MaximumRowsParamterName
但是我这里使用通过在ObjectDataSource的Selecting事件中给这个赋值,这样就直接可以使用第三方的分页控件了
protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
Models.UserInfo info = new Models.UserInfo();
info.uname = txt_name.Text;
e.InputParameters["info"] = info;
e.InputParameters["start"]=传入的值;
e.InputParameters["max"]=传入的值;
}
这样我们就可以将你自己赋值的info对象和从分页控件得来的start和max值传入到BLL中的Select方法中了.
这里讲述了如何通过事件给已订好的方法动态的传递你的值.
这里需要注意:因为现在的参数是后期才赋值的所以你必须在你的查询按钮中添加一句话
protected void btn_query_Click(object sender, EventArgs e)
{
GridView1.DataBind();//这里必须重新绑定一下GridView
}