0

我最近对我的 vb 项目表单中的一个 subs 进行了一些更改,现在在尝试加载表单时出现错误。我不知道什么start indexParameter name与表格有关,所以不要从哪里开始寻找解决这个问题。这是我收到的错误消息:

An error occurred creating the form. See Exception.InnerException for details.  The error is: StartIndex cannot be less than zero.
Parameter name: startIndex

我更改的 Sub 是下面代码中的最后一个 sub,称为TextBox1changed_textchanged. 我添加了除了最后 5 行之外的所有内容,以限制可以放入文本框中的字符。这个新代码是从另一个论坛页面编辑的,所以我认为它应该可以正常工作,但我不能确定表单将不再运行。

Public Class frmAddQuantity

Private Sub frmFieldMaster_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    cmbStateRateSumRatio.Items.Clear()
    cmbStateRateSumRatio.Items.Insert(0, "State")
    cmbStateRateSumRatio.Items.Insert(1, "Rate")
    cmbStateRateSumRatio.Items.Insert(2, "Sum")
    cmbStateRateSumRatio.Items.Insert(3, "Ratio")


End Sub

Private Sub bttAddQUAtoDatabase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttAddQUAtoDatabase.Click

    AddQuantity("'" & TextBox1.Text & "', '" & TextBox2.Text & "', '" & cmbStateRateSumRatio.Text & "'")

    InitialiseAll()
    frmFieldMaster.InitialiseNewParameter()
    Me.Close()

End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged

    If TextBox2.Text <> "Enter SI Units" Then
        If cmbStateRateSumRatio.SelectedIndex <> -1 Then
            bttAddQUAtoDatabase.Enabled = True
        End If
    End If
End Sub

Private Sub cmbStateRateSumRatio_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbStateRateSumRatio.SelectedIndexChanged

    If TextBox1.Text <> "Enter Quantity" Then
        If TextBox2.Text <> "Enter SI Units" Then
            bttAddQUAtoDatabase.Enabled = True
        End If
    End If

End Sub

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged


    Dim charactersAllowed As String = " abcdefghijklmnopqrstuvwxyz1234567890^-*()."
    Dim Text As String = TextBox2.Text
    Dim Letter As String
    Dim SelectionIndex As Integer = TextBox2.SelectionStart
    Dim Change As Integer




    Letter = TextBox2.Text.Substring(SelectionIndex - 1, 1)
    If Letter = "/" Then
        Text = Text.Replace(Letter, "^(-")
        SelectionIndex = SelectionIndex - 1
    End If



    Letter = TextBox2.Text.Substring(SelectionIndex - 1, 1)
    If charactersAllowed.Contains(Letter) = False Then
        Text = Text.Replace(Letter, String.Empty)
        Change = 1
    End If


    TextBox2.Text = Text
    TextBox2.Select(SelectionIndex - Change, 0)

    If TextBox1.Text <> "Enter Quantity" Then
        If cmbStateRateSumRatio.SelectedIndex <> -1 Then
            bttAddQUAtoDatabase.Enabled = True
        End If
    End If

End Sub

结束类

4

2 回答 2

1

抛出异常时告诉调试器停止。Debug + Exceptions,勾选 CLR exceptions 的 Throw 复选框。

您的代码段中有一个很好的候选人可以解决这个例外:

Letter = TextBox1.Text.Substring(SelectionIndex - 1, 1)

您需要处理文本框为空或 SelectionStart 属性为 0 的可能性。这将始终使用“StartIndex 不能小于零”来轰炸您的代码。

于 2012-09-06T12:18:05.987 回答
0
Private Const AllowedChars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890^-*()."

Private Sub TxtSIUnit_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSIUnit.KeyPress
    If e.KeyChar >= " "c AndAlso Not AllowedChars.Contains(e.KeyChar) Then e.Handled = True
End Sub

Private Sub TxtSIUnit_KeyPress2(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSIUnit.KeyPress
    Dim selectstart
    If e.KeyChar = "/" Then
        e.Handled = True
        selectstart = txtSIUnit.SelectionStart
        txtSIUnit.SelectedText = "*^-1"
        txtSIUnit.Select(selectstart + 1, 0)
    End If
End Sub

我已经使用此代码解决了上述问题。而不是使用.textchanged我使用的手柄.keypress来停止我之前遇到的问题。文本框中的文本随着表单的加载而变化,导致文本的起始索引出现问题。仅使用.keypress平均用户输入让代码运行,避免加载错误。

于 2012-11-06T09:15:27.027 回答