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
相关产品推荐
相关产品推荐

