You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中如何将字符串值转换为Color类型?解决转换无效错误

解决VB.NET中Color字符串转Color类型的转换错误

问题原因

数据库中存储的是Color.FromArgb(28, 78, 128)格式的字符串,直接将其赋值给Color类型变量时,.NET无法自动完成这种格式的字符串到Color对象的转换,因此抛出“指定的转换无效”错误。


解决方法

方法1:解析字符串提取RGB值(推荐)

直接从字符串中提取RGB参数,手动调用Color.FromArgb()创建Color对象,安全且高效。

首先定义解析函数:

Private Function ParseColorFromString(colorStr As String) As Color
    ' 提取括号内的RGB参数部分
    Dim paramStart = colorStr.IndexOf("(") + 1
    Dim paramEnd = colorStr.IndexOf(")")
    Dim paramPart = colorStr.Substring(paramStart, paramEnd - paramStart)
    
    ' 分割并转换为整数
    Dim rgbParts = paramPart.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries)
    Dim r = Integer.Parse(rgbParts(0).Trim())
    Dim g = Integer.Parse(rgbParts(1).Trim())
    Dim b = Integer.Parse(rgbParts(2).Trim())
    
    Return Color.FromArgb(r, g, b)
End Function

然后修改原代码的赋值逻辑(同时修复原代码只处理第一行的逻辑错误):

ConnecDatabase2()

Sql = "Select SettingName,SettingValue From [SoftSettings] where [SettingName] in ('BG_Color','Fore_Color')"
cmd = New SqlCommand
With cmd
    .Connection = Conn
    .CommandText = Sql
End With
da = New SqlDataAdapter(cmd)
dt = New DataTable
da.Fill(dt)

If dt.Rows.Count > 0 Then
    For Each row As DataRow In dt.Rows
        Select Case row("SettingName").ToString()
            Case "BG_Color"
                GlobalVariables.BG_Color = ParseColorFromString(row("SettingValue").ToString())
            Case "Fore_Color"
                GlobalVariables.Fore_Color = ParseColorFromString(row("SettingValue").ToString())
        End Select
    Next
End If

方法2:动态编译执行字符串(不推荐)

如果字符串格式严格符合.NET语法,可通过动态编译生成Color对象,但存在安全风险,仅用于测试场景:

Private Function EvalColor(colorStr As String) As Color
    Dim vbProvider = New Microsoft.VisualBasic.VBCodeProvider()
    Dim compileParams = New CompilerParameters()
    compileParams.ReferencedAssemblies.Add("System.Drawing.dll")
    compileParams.GenerateInMemory = True
    
    Dim code = $"Imports System.Drawing
Public Module ColorHelper
    Public Function GetColor() As Color
        Return {colorStr}
    End Function
End Module"
    
    Dim compileResult = vbProvider.CompileAssemblyFromSource(compileParams, code)
    If compileResult.Errors.HasErrors Then
        Throw New Exception($"编译失败:{compileResult.Errors(0).ErrorText}")
    End If
    
    Dim helperType = compileResult.CompiledAssembly.GetType("ColorHelper")
    Dim getColorMethod = helperType.GetMethod("GetColor")
    Return DirectCast(getColorMethod.Invoke(Nothing, Nothing), Color)
End Function

额外优化点

  • 删除原代码中多余的cmd.ExecuteNonQuery(),DataAdapter.Fill()会自动执行查询,无需额外调用。
  • 遍历DataTable所有行,原代码仅处理第一行,会导致Fore_Color始终取第一行的值,逻辑错误。

内容的提问来源于stack exchange,提问作者Scorpion_RJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:43:08