VB Net — Как получить каскадный выпадающий список, чтобы выбрать строку для самостоятельной вставки без ошибок?

#vb.net #visual-web-developer-2010

#vb.net #visual-web-developer-2010

Вопрос:

У меня 4 dropdownlist в моей веб-форме, которая является каскадной, значение 1-го dropdownlist повлияет на выбор 2-го dropdownlist и так далее.

 Protected Sub line_selectedindexchanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim level1_ID As Integer = Convert.ToInt32(line.SelectedValue.ToString())
    FillProcess(level1_ID)

End Sub

Protected Sub ddlprocess_selectedindexchanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim level2_ID As Integer = Convert.ToInt32(ddlprocess.SelectedValue.ToString())
    FillEquipment(level2_ID)

End Sub

Protected Sub equipment_selectedindexchanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim level3_ID As Integer = Convert.ToInt32(equipment.SelectedValue.ToString())
    FillStep(level3_ID)

End Sub

Private Sub FillLine() '1st dropdown

    Dim dt As New DataTable
    Dim strSql = "select distinct level1_id, [LCODE1]  ' | ' [LNAME1] as [LCODE1]" _
                      amp; " FROM [SQLIOT].[dbo].[ZVIEW_MCM_LEVEL_LOOKUP]"
    Using conn As New SqlConnection(ConStr),
        cmd As New SqlCommand(strSql, conn)
        conn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    If dt.Rows.Count > 0 Then
        line.DataSource = dt
        line.DataTextField = "LCODE1"
        line.DataValueField = "level1_id"
        line.DataBind()
        line.Items.Insert(0, "")
    End If

End Sub

Private Sub FillProcess(ByVal level1_ID As Integer) '2nd dropdown

    Dim dt As New DataTable
    Dim strSql = "select distinct level2_id, [LCODE2]  ' | ' [LNAME2] as [LCODE2] " _
                  amp; "FROM [SQLIOT].[dbo].[ZVIEW_MCM_LEVEL_LOOKUP] where level1_id = @level1_id"
    Using conn As New SqlConnection(ConStr),
        cmd As New SqlCommand(strSql, conn)
        cmd.Parameters.Add("@level1_id", SqlDbType.Int).Value = level1_ID
        conn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    If dt.Rows.Count > 0 Then
        ddlprocess.DataSource = dt
        ddlprocess.DataTextField = "LCODE2"
        ddlprocess.DataValueField = "level2_id"
        ddlprocess.DataBind()
        ddlprocess.Items.Insert(0, "")
    End If

End Sub

Private Sub FillEquipment(ByVal level2_ID As Integer) '3rd dropdown

    Dim dt As New DataTable
    Dim strSql = "select distinct level3_id, [LCODE3]  ' | ' [LNAME3] as [LCODE3] " _
                 amp; "FROM [SQLIOT].[dbo].[ZVIEW_MCM_LEVEL_LOOKUP] where level2_id = @level2_id"
    Using conn As New SqlConnection(ConStr),
        cmd As New SqlCommand(strSql, conn)
        cmd.Parameters.Add("@level2_id", SqlDbType.Int).Value = level2_ID
        conn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    If dt.Rows.Count > 0 Then
        equipment.DataSource = dt
        equipment.DataTextField = "LCODE3"
        equipment.DataValueField = "level3_id"
        equipment.DataBind()
        equipment.Items.Insert(0, "")
    End If

End Sub

Private Sub FillStep(ByVal level3_ID As Integer) '4th dropdown

    Dim dt As New DataTable
    Dim strSql = "select distinct [LCODE4]  ' | ' [LNAME4] as [LCODE4] " _
                 amp; "FROM [SQLIOT].[dbo].[ZVIEW_MCM_LEVEL_LOOKUP] where level3_id = @level3_id"
    Using conn As New SqlConnection(ConStr),
        cmd As New SqlCommand(strSql, conn)
        cmd.Parameters.Add("@level3_id", SqlDbType.Int).Value = level3_ID
        conn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    If dt.Rows.Count > 0 Then
        [step].DataSource = dt
        [step].DataTextField = "LCODE4"
        [step].DataBind()
        [step].Items.Insert(0, "")
    End If

End Sub
  

Причина, по которой я хочу пустую 1-ю строку, заключается в том, что при загрузке формы я хочу, чтобы все dropdownlist начинались пустыми. Во время тестирования я подумал попробовать вернуться к пустой 1-й строке после выбора значения. Это приводит к возникновению ошибки при:

 'Any one of the selectedindexchanged sub depending on which list I used
Protected Sub line_selectedindexchanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim level1_ID As Integer = Convert.ToInt32(line.SelectedValue.ToString()) '--> issue here
    FillProcess(level1_ID)

End Sub
  

Сообщение об ошибке:

 Input string was not in a correct format.
  

Что я могу сделать, чтобы исправить это?

Комментарии:

1. кажется, строка. SelectedValue’ не является числовым значением, проверьте его перед преобразованием.

2. Я знаю, что установка фиктивного значения строки в 0 может решить проблему. Но я действительно хочу, чтобы он был пустым. Есть ли какой-нибудь способ заставить пробел считываться как 0?

3. как насчет: если (int. Попробуйте проанализировать (строка. Выбранное значение. toString(), out int level1_ID){FillProcess(level1_ID);}else{FillProcess(0);}

4. это на C #? Я не думаю, что VB. Net может использовать символ { }. Может ли это?