0

私は現在、実行時に一連の HTML フォーム コントロールを動的に生成し、それらのコントロールをデータバインドするコードをまとめようとしています。私が読んだことによると<input><textarea>、 などのフォーム コントロールをデータバインドすることはできませんが、これに関する情報はすべて数年前のものです。.net 4.5 でこれを実行できるかどうかはわかりません。

いずれにせよ、私が求めているのは、私がやろうとしていることを達成するための最良の方法は何か、それは私がすでに持っているものを活用することなのか、それともまったく異なる方向からそれを行うことなのかということです.

この動的に生成されるフォームの目的は 2 つあります。

  1. 既存の Web サイトでニュース投稿を作成/変更/削除する機能
  2. 可能な限りコードを変更せずにこのコードを再利用する機能

これが私の現在のコードです:

<%@ 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>

ありがとう!

4

1 に答える 1