我正在一個網站上創建一個表單頁面并添加了一個“全部清除”按鈕以允許一次性清除所有文本框。我嘗試了
如前所述,您可以撰寫一個自定義例程 - 但是您將一遍又一遍地重寫它。
因此,雖然我用“f”標記所有控制元件以自動從資料庫加載/保存資料(也撰寫了一次這些例程!!!),一個清晰的例程看起來像這樣:
Public Sub fclear(F As HtmlGenericControl)
For Each c As System.Web.UI.Control In F.Controls
Select Case c.GetType
Case GetType(TextBox)
Dim ctlC As TextBox = c
If Not ctlC.Attributes("f") Is Nothing Then
ctlC.Text = ""
End If
Case GetType(Label)
Dim ctlC As Label = c
If Not ctlC.Attributes("f") Is Nothing Then
ctlC.Text = ""
End If
Case GetType(DropDownList)
Dim ctlC As DropDownList = c
If Not ctlC.Attributes("f") Is Nothing Then
ctlC.Text = ""
ctlC.SelectedItem.Text = ""
ctlC.SelectedItem.Value = ""
End If
Case GetType(CheckBox)
Dim ctlC As CheckBox = c
If Not ctlC.Attributes("f") Is Nothing Then
ctlC.Checked = False
End If
Case GetType(RadioButtonList)
Dim ctlC As RadioButtonList = c
If Not ctlC.Attributes("f") Is Nothing Then
ctlC.SelectedValue = -1
End If
End Select
Next
End Sub
因此,我們將“div”與控制元件組一起傳遞。由于每種型別的控制元件都需要不同的代碼來清除,那么隨著時間的推移,當然可以添加更多的控制元件。假設您可以在上面添加一個串列框(我還沒有)。
并注意對于復選框控制元件或下拉選單,要清除的代碼將有所不同。
另外,正如我在上面指出的,我有一個自定義的“f”標簽。那個簡單的讓我確定資料庫的列。
所以,我有一個例程(幾乎與上面相同),并用一個資料記錄加載 div,我有這個代碼:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim rstData As DataTable
rstData = MyRst("SELECT * FROM tblHotelsA WHERE ID = 5")
fLoader(EditRecord, rstData.Rows(0))
End If
End Sub
我現在明白了:

真的公平嗎?在這篇文章和答案之前,我從來不需要一個“清除”例程,因為我創建了資料庫行,并將其傳遞給上面的 floader 例程,這并沒有清除資料,但實際上顯示了新的記錄我,因此我不必撰寫清晰的例程。
在上面,保存按鈕?就是這個代碼:
Protected Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click
Call fWriter(EditRecord, 5, "tblHotelsA", My.Settings.TEST4)
End Sub
我只傳遞了“div”、表名和 pk,例程為我完成了所有作業。
正如我所說,如果您真的要費盡心思撰寫一些例程來清除控制元件,那么您不妨利用這些作業、努力并為您構建一個資料系結例程。
因此,將這些控制元件保存回資料庫的代碼看起來非常像 clear 例程 - 這個:
Public Sub fWriter(f As HtmlGenericControl, fPK As Integer, strTable As String, strCon As String)
' opposte of fLoader - write a data form to table
Dim rstData As New DataTable
Dim strSQL = "SELECT * FROM " & strTable & " WHERE ID = " & fPK
Dim cmdSQL As New SqlCommand(strSQL)
Using conn As New SqlConnection(strCon)
cmdSQL.Connection = conn
Using cmdSQL
conn.Open()
rstData.Load(cmdSQL.ExecuteReader)
End Using
End Using
Dim rst As DataRow = rstData.Rows(0)
' send conrols to this one data row
For Each c As System.Web.UI.Control In f.Controls
Select Case c.GetType
Case GetType(TextBox)
Dim ctlC As TextBox = c
If Not ctlC.Attributes("f") Is Nothing Then
If rst.Table.Columns.Contains(ctlC.Attributes("f")) Then
rst(ctlC.Attributes("f")) = IIf(ctlC.Text = "", DBNull.Value, ctlC.Text)
End If
End If
Case GetType(Label)
Dim ctlC As Label = c
If Not ctlC.Attributes("f") Is Nothing Then
If rst.Table.Columns.Contains(ctlC.Attributes("f")) Then
rst(ctlC.Attributes("f")) = IIf(ctlC.Text = "", DBNull.Value, ctlC.Text)
End If
End If
Case GetType(DropDownList)
Dim ctlC As DropDownList = c
If Not ctlC.Attributes("f") Is Nothing Then
If rst.Table.Columns.Contains(ctlC.Attributes("f")) Then
rst(ctlC.Attributes("f")) = IIf(ctlC.Text = "", DBNull.Value, ctlC.Text)
End If
End If
Case GetType(CheckBox)
Dim ctlC As CheckBox = c
If Not ctlC.Attributes("f") Is Nothing Then
If rst.Table.Columns.Contains(ctlC.Attributes("f")) Then
rst(ctlC.Attributes("f")) = ctlC.Checked
End If
End If
Case GetType(RadioButtonList)
Dim ctlC As RadioButtonList = c
If Not ctlC.Attributes("f") Is Nothing Then
If rst.Table.Columns.Contains(ctlC.Attributes("f")) Then
rst(ctlC.Attributes("f")) = ctlC.SelectedValue
End If
End If
End Select
Next
' data row is filled, write out changes
Using conn As New SqlConnection(strCon)
Using cmdSQL
cmdSQL.Connection = conn
conn.Open()
Dim da As New SqlDataAdapter(cmdSQL)
Dim daU As New SqlCommandBuilder(da)
da.Update(rstData)
End Using
End Using
End Sub
那么,既然你必須花那杯咖啡來建立一個例程來獲得那種控制,并保持清晰呢?不妨剪切 粘貼該例程,然后創建您的 floader() 例程和 fwriter() 例程 - 因為它們都有代碼來確定您用來清除的控制元件型別。
如前所述,隨著時間的推移,您可以添加更多控制元件,例如串列框,或者更好地支持單選按鈕串列或復選框串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475738.html
