【问题标题】:Converting String to Boolean Value .net将字符串转换为布尔值.net
【发布时间】:2016-03-22 13:38:52
【问题描述】:

我正在创建一个学生信息系统,学生可以在其中输入他们的结果并计算他们的最终总成绩。在“项目结果”组框中,学生输入他们的项目结果(满分 50 分),他们的百分比在TextBox1 中计算。

但是,我想包含复选框以适应某些条件;例如,如果选中checkbox2,则表示该项目迟交了 7 天 = 最终成绩中扣除 10%。我已完成以下代码,但出现以下运行时错误:

从字符串“TrueTrue”到类型“布尔”的转换无效

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim a As Integer
    Dim b As Decimal

    If IsNumeric(TextBox3.Text) & CheckBox2.Checked.ToString Then
        If TextBox3.Text <= 20 Then
            a = (TextBox3.Text * 100) / 20
            TextBox4.Text = a
            b = a * 0.1 - 0.1

            TextBox5.Text = CDec(b)




        Else
            MsgBox("Please Enter value equal to 20 and below!")
        End If
    End If

我想知道如何将布尔值转换为字符串,或者即使有更好的方法来完成我的任务?

【问题讨论】:

  • 如果您切换Option Strict On,您将立即看到您的错误,因为这不会编译。那应该给你一个指针
  • 您好,如果有人的回答对您有用,请单击旁边的勾号。 - 它可以帮助正在寻找解决方案的其他用户。他们可以看到问题的答案已被接受并且可能对他们有用。当然,回答问题的人会获得声誉——而且(感谢@JamesThorpe)你也会因为接受而获得 2 个代表。

标签: vb.net visual-studio checkbox boolean-expression


【解决方案1】:

CheckBox2.Checked 已经是一个布尔值。当您在末尾添加 ToString 时,您将其强制为字符串。这与前面的&amp;(即字符串连接运算符)相结合,这就是您最终得到"TrueTrue" 的原因。你想要的是这样的:

If IsNumeric(TextBox3.Text) And CheckBox2.Checked Then

旁注:您那里的复选框暗示用户应该只选择其中一个(例如,不能同时“准时”和“迟到”) - 单选按钮在这里是更好的 UI 选择。

【讨论】:

  • 工作得很好,谢谢,我也将复选框改为单选按钮!
【解决方案2】:

您应该将行更改为

If IsNumeric(TextBox3.Text) And CheckBox2.Checked Then

或更快地检查

If IsNumeric(TextBox3.Text) AndAlso CheckBox2.Checked Then

为什么?

VB 使用And 代替&amp; 并使用AndAlso 代替&amp;&amp;

VB 中的& Operator 用于强制字符串连接。

所以If IsNumeric(TextBox3.Text) &amp; CheckBox2.Checked.ToString Then 行(如果两者都是真的)

等于If True &amp; True Then

变成If "TrueTrue" Then

由于没有将类型String自动转换为Boolean,所以抛出异常。

使用AndAlso 会比使用And 快一点,因为如果之前的条件被证明为假,它不会评估后续条件。

VBC++ 之间的比较

VB      | C++
And     | &
AndAlso | &&

注意

@James Thorpe 的解决方案也可以,但我建议使用 AndAlso

另见:

Which is better for performance? And vs AndAlso

Differences in boolean operators: & vs && and | vs ||

【讨论】:

  • 虽然您对性能的看法是正确的,但在这种情况下,某些东西只会在一次计算中运行一次,并且在 IsNumeric 之后完成,并且只检查布尔属性而不是执行任何复杂的东西,我怀疑性能差异在这里永远都不值得担心。
  • @JamesThorpe 是的,但我认为这是程序员应该注意的事情。请参阅this 文章。
  • 当然,我只是说不值得担心这里。这是对您答案的一个很好的补充,但是在这里可以改善您的答案的是解释 为什么 OP 应该更改该代码行。你直接从“你应该这样做”没有“为什么你应该这样做”到相关的事情,但根本没有解释实际问题。
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 2012-03-10
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多