DetailsView应用之雕虫小技

问题一:我在使用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
分享到:
原文地址:https://www.cnblogs.com/qqhfeng/p/2153879.html