需要清除 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 个都有代码来确定您用来清除的控件类型。
如前所述,随着时间的推移,您可以添加更多控件,例如列表框,或更好地支持单选按钮列表或复选框列表。
我在一个网站上工作,我在其中创建了一个表单页面并添加了一个“全部清除”按钮以允许一次性清除所有文本框。我尝试了 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 个都有代码来确定您用来清除的控件类型。
如前所述,随着时间的推移,您可以添加更多控件,例如列表框,或更好地支持单选按钮列表或复选框列表。