問題一:我在使用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