0

ブール値がTrueかFalseかを確認しました。false の場合、サーバー名のテキストが赤色に変更されます。True の場合、色は変更されません。SQL は、テキストの色を変更しないサーバー名を読み取ることができましたが、赤色のテキストで色付けされたサーバー名を読み取ることができず、SQL エラー メッセージを受け取りました。

System.Data.SqlClient.SqlException (0x80131904): 'red' 付近の構文が正しくありません。

VBコードは次のとおりです。

Dim sqlConn As New System.Data.SqlClient.SqlConnection((ConfigurationManager.ConnectionStrings("SOCT").ConnectionString))
Dim strSqlSecondary As String = "SELECT [Name], [Compliance] FROM [dbo].[ServerOwners] where SecondaryOwner like @uid order by [name]"
Dim cmdSecondary As New System.Data.SqlClient.SqlCommand(strSqlSecondary, sqlConn)

cmdSecondary.Parameters.AddWithValue("@uid", TNN.NEAt.GetUserID())

Dim dr As System.Data.SqlClient.SqlDataReader

Try
   sqlConn.Open()
   Dim root As TreeNode
   Dim rootNode As TreeNode
   Dim firstNode As Integer = 0
   'Load Primary Owner Node
   'Create RootTreeNode
   dr = cmdSecondary.ExecuteReader()

   If dr.HasRows Then
      'Load Secondary Owner Node
      'Create RootTreeNode
      root = New TreeNode("Secondary Owner", "Secondary Owner")
      TreeViewGroups.Nodes.Add(root)
      root.SelectAction = TreeNodeSelectAction.None

      rootNode = TreeViewGroups.Nodes(firstNode)
      'populate the child nodes
      While dr.Read()
         Dim child As TreeNode = New TreeNode(dr("Name"), dr("Name"))
         Dim complianceFlag As Boolean

         If Boolean.TryParse(dr("Compliance"), complianceFlag) Then
            ' Yes, compliance value is a Boolean, now set color based on value
            If Not complianceFlag Then
               child.Text = "<div style='color:red'>" + child.Text + "</div>"
            End If
        End If
        rootNode.ChildNodes.Add(child)
        child.SelectAction = TreeNodeSelectAction.None
      End While
    dr.Close()

「赤」と表示されているため、エラーは次の行コードから発生しました。

child.Text = "<div style='color:red'>" + child.Text + "</div>"

リンクをクリックして更新すると、子ノードのテキストが渡されます。

Protected Sub LinkButtonConfirm_Click(sender As Object, e As System.EventArgs) Handles LinkButtonConfirm.Click
hide()
PanelCompliance.Visible = True
PanelDisplayGrid.Visible = True
'display the servers
Dim sqlConn As New System.Data.SqlClient.SqlConnection((ConfigurationManager.ConnectionStrings("SOCT").ConnectionString))
Dim strSql As New StringBuilder
strSql.Append("Select [Name] , [ApplicationName] , [Environment], [Description], [TechMgmtTeam] , [PrimaryOwner], [PPhone], [SecondaryOwner], [SPhone], [Queue], [Crit] from dbo.ServerOwners where")

'Loops Through all Selected items and appends to sql statement
Dim x As Integer = 0
For Each item As TreeNode In TreeViewGroups.CheckedNodes
If item.Depth = 0 Then
Else
   'append to select statement
    strSql.Append(" [Name]='" & item.Text & "' or ")
    x = x + 1
End If
Next

If x = 0 Then
   hide()
   LabelError.Text = "Please select at least one server in the left pane."
   PanelError.Visible = True
Else
   strSql.Append(" [Name]='Blank' order by [name]")
   Try
      sqlConn.Open()
      Dim cmd As New System.Data.SqlClient.SqlCommand(strSql.ToString(), sqlConn)
      Dim a As New SqlClient.SqlDataAdapter(cmd)
      Dim datTab As New DataTable
      a.Fill(datTab)

      Session("Table") = datTab

      GridViewDisp.DataSource = datTab
      GridViewDisp.DataBind()
   Catch ex As Exception
      hide()
      LabelError.Text = ex.ToString()
      PanelError.Visible = True
   Finally
      sqlConn.Close()
      sqlConn.Dispose()
   End Try
End If
End Sub

Div タグを取り除くと、赤に色付けされないことを除いて、すべて正常に動作します。スタイルを無視して子テキストに焦点を当てる必要があるDivスタイルをどのように読み取ることができるか。修正する方法はありますか?

4

2 に答える 2

2

Name を子の .Tag プロパティに保存すると、子の .Text に何をしても、それを使用できるようになります。

While dr.Read()
    Dim myName as String = dr("Name")
    Dim child As TreeNode = New TreeNode(myName , myName)
    child.Tag = myName

次にLinkButtonConfirm_Click

Dim x As Integer = 0
For Each item As TreeNode In TreeViewGroups.CheckedNodes
    If item.Depth <> 0 Then
        'append to select statement
        strSql.Append(" [Name]='" & CStr(item.Tag) & "' or ")
        x = x + 1
    End If
Next

CStr(item.Tag)ただし、 as SQL パラメータを追加する必要があります。xパラメーター名 ("@p0"、"@p1" など) を作成するために使用できるループ内のカウンターが既にあります。

編集: Click ハンドラーは次のようになります。

Protected Sub LinkButtonConfirm_Click(sender As Object, e As System.EventArgs) Handles LinkButtonConfirm.Click
    hide()
    PanelCompliance.Visible = True
    PanelDisplayGrid.Visible = True
    'display the servers
    Dim sqlConn As New System.Data.SqlClient.SqlConnection((ConfigurationManager.ConnectionStrings("SOCT").ConnectionString))
    Dim cmd As New System.Data.SqlClient.SqlCommand
    Dim strSql As New StringBuilder
    Dim qryBase = <sql>
                      SELECT [Name]
                            ,[ApplicationName]
                            ,[Environment]
                            ,[Description]
                            ,[TechMgmtTeam]
                            ,[PrimaryOwner]
                            ,[PPhone]
                            ,[SecondaryOwner]
                            ,[SPhone]
                            ,[Queue]
                            ,[Crit]
                        FROM dbo.ServerOwners
                        WHERE
                  </sql>.Value

    strSql.Append(qryBase & " ")

    'Loop through all Selected items and append to sql statement
    Dim x As Integer = 0
    Dim nLastCheckedNode As Integer = TreeViewGroups.CheckedNodes.Count - 1
    For Each item As TreeNode In TreeViewGroups.CheckedNodes
        If item.Depth <> 0 Then
            'append to select statement
            Dim paramName As String = "@p" & x.ToString()
            strSql.Append("[Name] = " & paramName)
            If x <> nLastCheckedNode Then
                ' we have another node to look at, so add " OR "
                strSql.Append(" OR ")
            End If

            'TODO: set the correct SqlDbType and the correct .Size
            cmd.Parameters.Add(New SqlParameter With {.ParameterName = paramName,
                                                      .SqlDbType = SqlDbType.NVarChar,
                                                      .Size = 20,
                                                      .Value = CStr(item.Tag)})

            x += 1
        End If
    Next

    If x = 0 Then
        hide()
        LabelError.Text = "Please select at least one server in the left pane."
        PanelError.Visible = True
    Else
        strSql.Append(" ORDER BY [Name]")
        Try
            sqlConn.Open()
            cmd.Connection = sqlConn
            cmd.CommandText = strSql.tostring()
            Dim a As New SqlClient.SqlDataAdapter(cmd)
            Dim datTab As New DataTable
            a.Fill(datTab)

            Session("Table") = datTab

            GridViewDisp.DataSource = datTab
            GridViewDisp.DataBind()
        Catch ex As Exception
            hide()
            LabelError.Text = ex.ToString()
            PanelError.Visible = True
        Finally
            sqlConn.Close()
            sqlConn.Dispose()
        End Try
    End If
End Sub
于 2013-11-04T21:44:26.163 に答える