需要清除 C# 中多个组内的所有文本框(Control.control 在我的版本中未被识别)

Need to clear all textboxes inside several group in C#(Control.control not being recognised in my version)

我在一个网站上工作,我在其中创建了一个表单页面并添加了一个“全部清除”按钮以允许一次性清除所有文本框。我尝试了 How to clear the text of all textBoxes in the form? but my ide is no recognizing it. Click to view Code snippet 中给出的 contol.controls 解决方案 我已经包含了这些库:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data.MySqlClient;
using System.Data;
using System.Configuration;

这就是其中一个文本框的创建方式:

<div class="form-group" style="width: 80%">
  <div class="input-group mb-2">
    <div class="input-group-prepend">
       <div class="input-group-text headDetails">Guide Name</div>
     </div>
     <asp:TextBox ID="TextBox9" runat="server" CssClass="form-control"></asp:TextBox>
 </div>
</div>

如何通过单击“全部清除”按钮清除所有文本框?

这是一个常见问题。事实上,我也有一个例程来填充数据库中的文本框。所以,现在我不必编写绑定代码了。

所以,我倾向于有两个套路:

floader() 此例程采用一个数据行,并推送到一组控件(我将它们放在带有“id”的 div 中)。

fwreite() 此例程采用 table 名称、pk id,并从控件中获取值,然后保存回数据库。

结果我只写了上面两个例程-现在网页上的数据绑定进出控件都是自动的,我不会一遍又一遍地写这段代码。

但是,我从来没有“清除”控制例程。但是,我可以把上面的套路拿过来,简单修改一下,现在就有了一个“清晰”的套路。

所以,假设我有这个标记:

  <div id="EditRecord" runat="server" style="float:left;display: normal;border:solid 2px;padding:5px">
        <div style="float:left" class="iForm">
                <label>HotelName</label>
                <asp:TextBox ID="txtHotel" runat="server" f="HOtelName" width="280" />  <br />
                <label>First Name</label>
                <asp:TextBox ID="tFN" runat="server" f="FirstName" Width="140" /> <br />
                <label>Last Name</label>
                <asp:TextBox ID="tLN" runat="server" f="LastName" Width="140" /> <br />
                <label>City</label>
                <asp:TextBox ID="tCity" runat="server" f="City" Width="140" /> <br />
                <label>Province</label><asp:TextBox ID="tProvince" runat="server" f="Province" Width="75"></asp:TextBox> <br />
        </div>
        <div style="float:left;margin-left:20px" class="iForm">
            <label>Description</label> <br />
            <asp:TextBox ID="txtNotes" runat="server" Width="400" TextMode="MultiLine" 
                Height="150px" f="Description" ></asp:TextBox> <br />
            <asp:CheckBox ID="chkActive" f="Active" Text=" Active" runat="server" TextAlign="Right" />
            <asp:CheckBox ID="chkBalcony" f="Balcony" Text=" Has Balcony" runat="server" TextAlign="Right" />
        </div>
        <div style="clear:both"></div>
      <asp:Button ID="cmdClear" runat="server" Text="Clear" CssClass="btn-info" />
   </div>

还有清除按钮,上面有这段代码:

Protected Sub cmdClear_Click(sender As Object, e As EventArgs) Handles cmdClear.Click

    ' clear all controls in div - with f tag

    fclear(Me.EditRecord)

End Sub

所以,现在我们有了这个:

如前所述,您可以编写一个自定义例程 - 但那样您会 re-writing 一遍又一遍。

所以,当我用“f”标记所有控件到 load/save 自动从数据库中获取数据时(也写过一次这些例程!!!),一个清晰的例程,看起来像这样:

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

我现在明白了:

真的公平吗?在这个 post 和回答之前,我从来不需要一个“清除”例程,因为我创建了数据库行,并将其传递给上面的 floader 例程,并且不会清除数据,但实际上会显示对我来说是新的 reocrd,因此我不必编写清晰的例程。

在上面,保存按钮?就是这个代码:

Protected Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click

    Call fWriter(EditRecord, 5, "tblHotelsA", My.Settings.TEST4)

End Sub

我只需传递“div”、table 名称和 pk,例程会为我完成所有工作。

正如我所说,如果您真的要费尽心机地编写一些例程来清除控件,那么您不妨利用这项工作、努力并为您构建一个数据绑定器例程。

因此,将这些控件保存回数据库的代码看起来非常像清除例程 - 这个:

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() 例程 - 因为它们中的所有 3 个都有代码来确定您用来清除的控件类型。

如前所述,随着时间的推移,您可以添加更多控件,例如列表框,或更好地支持单选按钮列表或复选框列表。