zoukankan      html  css  js  c++  java
  • 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
    分享到:
  • 上一篇:C#操作存储过程,输入参数,返回结果
  • 下一篇:GridView技巧
查看全文
  • 相关阅读:
    HDU 4512 吉哥系列故事——完美队形I (LCIS)
    HDU 4506 小明系列故事——师兄帮帮忙
    SDUT Greatest Number
    HDU 4545 魔法串
    HDU 4546 比赛难度 (优先队列 * * )
    Android布局学习
    K9mail编译
    没有小的项目
    dxDBTreeView自动删除数据问题
    SQL Server查看表空间占用情况
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/2153879.html
  • Copyright © 2011-2022 走看看