注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

[转载] DetailsView应用之雕虫小技 (2008-07-16 09:04)  

2014-09-25 06:45:18|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
[转载] DetailsView应用之雕虫小技 (2008-07-16 09:04)
分类:编程

DetailsView应用之雕虫小技

吴俊


《软件报》2008年第9期?? 邮发代号:61-74
问题一:我在使用DetailsView的过程中发现,每次进入DetailsView的新建或者编辑状态后,默认光标不会自动定位到DetailsView的第一个录入框,请问有什么办法可以解决?
解答:要使得光标自动定位到DetailsView编辑界面上第一个录入控件有一个简单的方法,只要在VS下打开页面的设计视图,然后切换到“源视图”,在“form”标记内添加以下代码“defaultfocus="DetailsView1"”,保存后运行就会发现光标已经会自动定位到DetailsView的第一个录入框了。
问题二:DetailsView是根据标题文字的长短自动设置标题列的宽度的,如果我想自己来定义标题列的宽度,该如何实现?
解答:要实现你提到的功能,使用DetailsView的HeaderStyle定义外观样式就可以了。和GridView一样,DetailsView也提供了大量的“******Style”属性供用户对DetailsView的外观进行自定义。只不过,很多刚刚接触DetailsView的人对各个“******Style”属性具体对应的外观不甚了解。其实,有一个简单的方法可以帮助大家快速了解DetailsView的各个样式属性,大家只要把DetailsView想像成GridView逆向旋转90度,就比较容易理解各个样式属性定义的外观位置了。
问题三:我希望DetailsView的标题能够随着编辑状态的变化而变化,例如编辑记录时显示“新建用户”或“编辑用户”、浏览记录时显示“查看用户”。
解答:可以在DetailsView的ModeChanged事件中通过CurrentMode属性的值得到DetailsView的当期状态,然后将Caption设置为相应的提示文字就可以了。具体实现代码如下:
??????? Select Case DetailsView1.CurrentMode
??????????? Case DetailsViewMode.Edit
??????????????? DetailsView1.Caption = "编辑"
??????????? Case DetailsViewMode.Insert
??????????????? DetailsView1.Caption = "新建"
??????????? Case DetailsViewMode.ReadOnly
??????????????? DetailsView1.Caption = "查看"
?? End Select
还需要说明的是,如果不是直接使用DetailsView自带的按钮,而是以代码方式通过DetailsView的ChangeMode方法修改DetailsView的编辑状态是不会触发ModeChanged事件的。
问题四:我想在DetailsView中新建记录时,为某个绑定字段设置一个默认值,但不知道怎么样才能在DetailsView中定位指定的控件?
解答:要解决这个问题,需要考虑两个步骤:第一、在什么时候定位;第二、怎么样定位。在DetailsView提供的众多事件,DataBounded事件是在完成数据绑定后触发的,这时DetailsView上的控件已经完成了初始化和数据绑定,是最适合修改默认的地方。由于绑定字段使用的控件名是在运行时动态分配的,无法使用FindControl方法,这时要定位录入控件,唯一的办法就是使用以下代码:
??????? Dim currentDate oldPassword As TextBox = CType(DetailsView1.Rows(2).Cells(1).Controls(0), TextBox)
TextBox StartDate = (TextBox)DetailsView1.Rows[1].Cells[1].Controls[0];
即利用DetailsView控件对应的控件树的层次关系实现录入控件的定位。接下来直接将TextBox的Text属性设置为默认数值就可以了。
需要注意,在执行上述代码设置默认值前,一定要判断DetailsView的CurrentMode属性是否等于DetailsViewMode.Insert。
问题五:我用DetailsView制作了一个密码修改界面,希望实现以下功能:如果用户没有输入原密码和新密码,表示保持原有密码不变,这时如果点击了更新按钮,DetailsView不执行更新数据的操作。
解答:要满足这个要求,需要在DetailsView的ItemUpdating事件中通过FindControl方法或者是问题四的解答中提到的方法找到输入密码的文本框,如果文本框的内容为空,则将ItemUpdating事件中的DetailsViewUpdateEventHandler参数的Cancel属性设置为True就可以了。具体的实现代码如下:
??? Protected Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating
??????? Dim oldPassword As TextBox = CType(DetailsView1.Rows(3).Cells(1).Controls(0), TextBox)
??????? Dim newPassword As TextBox = CType(DetailsView1.Rows(4).Cells(1).Controls(0), TextBox)
??????? If (oldPassword.Text = String.Empty OrElse newPassword.Text = String.Empty) Then
??????????? e.Cancel = True
??????? End If
??? End Sub
问题六:我在使用DetailsView的过程中发现,即使没有对数据进行修改,点击更新按钮后,DetailsView仍然会提交更新。我觉得这样会影响程序性能,想知道怎么样才能让DetailsView只在数据发生变化的情况下提交更新?
解答:要实现这个功能,可以利用ItemUpdating事件中的DetailsViewUpdateEventHandler参数的NewValues属性和OldValues属性,这两个属性分别保存了修改前后的数据集合,通过比对这两个属性就可以了解到用户是否修改了DetailsView中的数据。具体实现的代码如下:
??? Protected Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating
??????? Dim isUpdated As Boolean = False
??????? For i As Integer = 0 To e.NewValues.Count - 1
??????????? ’至少有一个数值更新
??????????? If e.NewValues(i) <> e.OldValues(i) Then
??????????????? isUpdated = True
??????????????? Exit For
??????????? End If
??????? Next
??????? If isUpdated = False Then
??????????? e.Cancel = True
??????????? DetailsView1.ChangeMode(DetailsViewMode.ReadOnly)
??????? End If
??? End Sub

转载自: http://

  评论这张
 
阅读(127)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017