DetailsView應用之雕蟲小技

來源:互聯網
上載者:User
問題一:我在使用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.