适用于 ASP.NET 的数据表单生成器,仅需 3 行代码






4.32/5 (15投票s)
适用于 ASP.NET 的数据表单生成器,类似于 Windows 应用程序的生成器。
引言
自从 VS.NET 带来了强大的数据表单生成器工具以来,我想为什么不能在 Windows 窗体和 ASP.NET 中都拥有类似的工具呢。
由于 Windows 应用程序和 ASP.NET 应用程序都使用相同的 ADO.NET 类,因此在 ASP.NET 中创建这样的工具是可能的,而且很棒。
我们特别关注的一点是,虽然在创建 Windows 应用程序使用的控件时可以使用 DataSet
来顺利进行,但对于 Web 应用程序,最佳实践是使用 DataReader
,因此这项工作确实非常辛苦,因为 reader 是只读的、向前移动的。
两年前,我开始编写这样的控件;这确实是一项漫长的任务,但我认为最终的成果对于我们使用这样一个我们制作的工具来说是良好且公平的。
背景
但在我们使用数据表单控件两年后(2002 年),并且项目完成后,Stephen Walther 的《Unleashed ASP.NET》这本伟大的书出版了。在审阅这本书时,我发现作者制作了相同的控件,但进行了大量的增强,而且它确实比我的好。它具有许多功能,并且定制得非常好,甚至比 Microsoft VS.NET 为 Windows 应用程序提供的数据表单生成器还要好,而且它使用 DataReader
而不是 DataSet
,因此它非常轻便。
我曾认为没有必要发布一篇讨论该控件的文章,因为微软肯定会用新的 VS.NET "Whidbey" 来制作相同或更好的版本。但在审阅了 ASP.NET V.2.0 "Whidbey" 的新功能后,我感到失望,因为微软并没有这样做!所以我认为发布这样一篇文章会很有用。
该控件本身是一组继承自 System.Web.UI.WebControls
类的控件,并分为两组:
- 一组处理 SQL Server 的控件。
- 一组 OleDB 控件,可以处理任何此类引擎。
我测试了 SQL 版本,它做得非常好,只有一些可以克服的小错误。但关于 OleDB 版本,我用 Oracle 9i 试过,但由于接收连接字符串时出现错误而未能工作。(希望很快能修复。)
使用代码
我制作了一个示例,展示了如何使用这个很棒的控件并完美地克服其错误。
- 首先,打开 VS.NET 并选择新建 ASP.NET Web 项目。
- 右键单击工具箱并选择添加/删除项,然后导航到附加项目文件夹的bin文件夹,然后选择Superexpert.DataForm.dll,这将添加 DataForm 的两组控件。
正如您所见,OleDB 控件是绿色的,SQL 控件是红色的。
- 首先,开始选择
SqlDataPanel
,您可以在其上添加所有想要的控件(如上图所示)。 - 设置
SqlDataPanel
属性,使其指向所需的表和键字段,如下图所示。
- 选择包含四个导航按钮的
SqlDataNavigator
控件,然后在页面加载事件处理程序中编写以下代码行,将导航器附加到SqlDataPanel
:SqlDataNavigator1.ControlToNavigate = Me.SqlDataPanel1
在页面加载处理程序中,您还应该将相同的连接字符串附加到导航器控件。
SqlDataNavigator1.Connection = Me.SqlDataPanel1.Connection
- 在此表单中放置您将使用的所有控件,但要从列出的集合中选择。例如:
如果您想在
TextBox
控件中显示字段,那么您必须选择DataTextBox
控件而不是它,并将其放置在您的SqlDataPanel
上。 - 每个数据控件都需要设置两个属性:
DataField
:包含绑定字段的名称。DataType
:包含绑定字段的数据类型。
提示
不要尝试在设计模式下设置连接字符串。我试过了,但不起作用,所以最好在页面加载处理程序中进行设置。(我的连接字符串位于web.config中,指向 SQL Server 著名的 Northwind 数据库。)
SqlDataPanel1.Connection = New _
SqlConnection(System.Configuration._
ConfigurationSettings.AppSettings("ConnStr"))
- 运行应用程序,您将看到可以非常流畅且快速地浏览 Northwind 的 Employees 表。
- Stephen 的控件具有添加记录、更新和删除按钮,但在尝试后,我发现它们不起作用,因此您必须像处理普通按钮一样手动处理它们,如本示例所示。
提示
如果您直接从Stephen 的网站下载该控件,它会显示一个评估消息,本文中附加的控件不会显示任何评估消息。
以下是处理此示例的所有代码:
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Put user code to initialize the page here
' Passing the Data Panel to the navigator coz it'll not
' work from design mode properties (bug)
SqlDataNavigator1.ControlToNavigate = Me.SqlDataPanel1
' also passing the connection string from web.config
' becoz passing it from the design mode will not work (bug)
SqlDataPanel1.Connection = New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
'and finally passing it to the navigator too.
SqlDataNavigator1.Connection = Me.SqlDataPanel1.Connection
End Sub
'Handling the add record btn
Private Sub DataAddButton1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles DataAddButton1.Click
Dim insertStr As String = "insert into Employees" & _
" (LastName,FirstName,Title,City,Country,HomePhone,Notes) values('"_
+ Me.LastName_Txt.Text + "','" + Me.FirstName_Txt.Text + _
"','" + Me.Title_Txt.Text + "', '" + Me.City_Txt.Text + _
"','" + Me.Cntry_Txt.Text + "','" + Me.HomePhone_Txt.Text + _
"','" + Me.Notes_Txt.Text + "')"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(insertStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub
'Handling the delete btn
Private Sub Delete_Btn_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Delete_Btn.Click
Dim delStr As String = _
"delete from Employees where EmployeeID='" + _
Me.EmpID_Txt.Text + "'"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(delStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub
'Handling the update btn
Private Sub DataUpdateButton1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles DataUpdateButton1.Click
Dim updateStr As String = "update Employees set LastName='" + _
Me.LastName_Txt.Text + "',FirstName='" + _
Me.FirstName_Txt.Text + "',Title='" + _
Me.Title_Txt.Text + "',City='" + _
Me.City_Txt.Text + "',Country= '" + _
Me.Cntry_Txt.Text + "',HomePhone='" + _
Me.HomePhone_Txt.Text + "',Notes='" + _
Me.Notes_Txt.Text + "' where EmployeeID='" + _
Me.EmpID_Txt.Text + "'"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(updateStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub