私は現在、実行時に一連の HTML フォーム コントロールを動的に生成し、それらのコントロールをデータバインドするコードをまとめようとしています。私が読んだことによると<input>
、<textarea>
、 などのフォーム コントロールをデータバインドすることはできませんが、これに関する情報はすべて数年前のものです。.net 4.5 でこれを実行できるかどうかはわかりません。
いずれにせよ、私が求めているのは、私がやろうとしていることを達成するための最良の方法は何か、それは私がすでに持っているものを活用することなのか、それともまったく異なる方向からそれを行うことなのかということです.
この動的に生成されるフォームの目的は 2 つあります。
- 既存の Web サイトでニュース投稿を作成/変更/削除する機能
- 可能な限りコードを変更せずにこのコードを再利用する機能
これが私の現在のコードです:
<%@ Import Namespace="System.Data" %>
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim dataSourceInfo As New DataSourceInfo
dataSourceInfo.TableName = "Post_Table"
dataSourceInfo.DataColumns = {"PostTitle", "PostContent", "PostURL", "PublishDate", "ExpirationDate", "Active"}
dataSourceInfo.KeyColumn = "ID"
BuildCMSForm(dataSourceInfo)
BindCMSForm(dataSourceInfo)
End Sub
Public Structure DataSourceInfo
Dim TableName As String
Dim DataColumns() As String
Dim KeyColumn As String
End Structure
Public Sub BuildCMSForm(ByVal dataSourceInfo As DataSourceInfo)
Dim dataSource As SqlDataSource = New SqlDataSource()
Dim strSelectCommand As String
dataSource.ProviderName = "System.Data.SqlClient"
dataSource.ConnectionString = "Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=Test_Web;Integrated Security=SSPI"
strSelectCommand = "SELECT COLUMN_NAME, DATA_TYPE " & _
"FROM INFORMATION_SCHEMA.COLUMNS " & _
"WHERE TABLE_NAME = '" & dataSourceInfo.TableName & "' " & _
"AND COLUMN_NAME IN ("
For Each col As String In dataSourceInfo.DataColumns
strSelectCommand = strSelectCommand & "'" & col.ToString & "', "
Next
strSelectCommand = strSelectCommand.Substring(0, strSelectCommand.Length - 2) & ")"
dataSource.SelectCommand = strSelectCommand
Dim dv As DataView
dv = CType(dataSource.Select(DataSourceSelectArguments.Empty), DataView)
For Each row As DataRow In dv.Table.Rows()
Dim newControlDiv As HtmlGenericControl = New HtmlGenericControl("div")
newControlDiv.Attributes.Add("id", "CMSControlDiv" & row.Item(0).ToString)
newControlDiv.Attributes.Add("class", "CMSControlDiv")
newControlDiv.InnerHtml = row.Item(0).ToString & ":<br />"
Select Case row.Item(1).ToString
Case "text"
Dim newControl As TextBox = New TextBox
newControl.TextMode = TextBoxMode.MultiLine
newControl.ID = row.Item(0).ToString
newControl.Attributes.Add("class", "CMSControl")
newControlDiv.Controls.Add(newControl)
Case "varchar"
Dim newControl As TextBox = New TextBox
newControl.ID = row.Item(0).ToString
newControl.Attributes.Add("class", "CMSControl")
newControlDiv.Controls.Add(newControl)
Case "datetime"
Dim newControl As TextBox = New TextBox
newControl.ID = row.Item(0).ToString
newControl.Attributes.Add("class", "CMSControl")
newControlDiv.Controls.Add(newControl)
Case "bit"
Dim newControl As CheckBox = New CheckBox
newControl.ID = row.Item(0).ToString
newControl.Attributes.Add("class", "CMSControl")
newControlDiv.Controls.Add(newControl)
End Select
AdminForm.Controls.Add(newControlDiv)
Next
Dim newSubmit As HtmlInputSubmit = New HtmlInputSubmit
newSubmit.Attributes.Add("id", "CMSSubmit")
newSubmit.Value = "Submit"
AdminForm.Controls.Add(newSubmit)
End Sub
Public Sub BindCMSForm(ByVal dataSourceInfo As DataSourceInfo)
Dim dataSource As SqlDataSource = New SqlDataSource()
Dim strSelectCommand As String
Dim strColumns As String = ""
dataSource.ProviderName = "System.Data.SqlClient"
dataSource.ConnectionString = "Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=Test_Web;Integrated Security=SSPI"
strSelectCommand = "SELECT TOP 1 {0} FROM {1} WHERE [PostType] = 'Event'"
For Each col As String In dataSourceInfo.DataColumns
strColumns = strColumns & "[" & col.ToString & "], "
Next
strColumns = strColumns.Substring(0, strColumns.Length - 2)
dataSource.SelectCommand = String.Format(strSelectCommand, strColumns, dataSourceInfo.TableName)
Dim dv As DataView
dv = CType(dataSource.Select(DataSourceSelectArguments.Empty), DataView)
For Each col As DataColumn In dv.Table.Columns()
Next
End Sub
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<meta charset="utf-8" />
<title></title>
<link href="~/styles/main.css" rel="stylesheet" />
</head>
<body>
<div id="wrapper" runat="server">
<div id="Content" class="Content" runat="server">
<form id="AdminForm" runat="server">
</form>
</div>
</div>
</body>
</html>
ありがとう!