2013-04-23 3 views
0

Im делает этот проект для онлайн-тестирования в ASP.NET в VB им с помощью Microsoft Visual студий 2012.Перебор текстовых и этикетки

Im пытается получить петлю происходит через мои текстовые поля и проверить их против слова это будет изменение, которое будет проверено в отношении базы данных, чтобы проверить, правильный ли ответ, но когда я делаю свой цикл, я не могу получить текст из текстового поля.

Пожалуйста, смотрите ниже

Private Sub GoGoGo() 

    Dim Textboxname As String  ' 
    Dim textbox As Object 
    Dim TextboxText As Object 
    Dim Labelname As String 
    Dim label As Object 
    Dim LabelText As Object 
    Dim Number As Integer = 1 
    Dim MaxTime As Integer = 9 
    Dim Currentloop As Integer = 1 



    For check As Integer = Currentloop To MaxTime 


     If Currentloop <= MaxTime Then 
      Textboxname = "TextQ" + Number 
      textbox = Textboxname 
      TextboxText = textbox 
      textbox.ReadOnly = True 

     End If 

     If Currentloop <= MaxTime Then 
      Labelname = "Label" + Number 
      label = Labelname 
      LabelText = label.Text 
      label.Visible = True 

     End If 

     Number = Number + 1 



     If TextboxText = "" Then 
      label.Text = "no imput" 
      label.ForeColor = Drawing.Color.Black 

     End If 

     If TextboxText = "server" Then 
      label.Text = "Correct" 
      label.ForeColor = Drawing.Color.Green 
     End If 

     If TextboxText = "Wrong" Then 
      label.Text = "Wrong" 
      label.ForeColor = Drawing.Color.Red 
     End If 


     If check = 9 Then 
      Exit For 
     End If 


    Next 

End Sub 

ответ

1

Похоже, что вы пытаетесь использовать строковый идентификатор элемента управления вместо фактического контроля. Вместо этого вы должны взять этот идентификатор и выполнить поиск фактического элемента управления на странице. Вы можете сделать это с помощью FindControl method

Ваша функция поэтому будет выглядеть примерно так (не компилировать тестировался):

Private Sub GoGoGo() 
    ' 
    Dim oTextBox As TextBox 
    Dim oLabel As Label 

    Dim MaxTime As Integer = 9 
    Dim Currentloop As Integer = 1 

    For check As Integer = Currentloop To MaxTime 

     If Currentloop <= MaxTime Then 
      'NB You may have to use a recursive call to FindControl. See below. 
      oTextBox = CType(Page.FindControl("TextQ" & CStr(check)), TextBox) 
      OTextBox.ReadOnly = True; 
     End If 

     If Currentloop <= MaxTime Then 
      'NB You may have to use a recursive call to FindControl. See below. 
      oLabel = CType(Page.FindControl("Label" & CStr(check)), Label) 
      oLabel.Visible = True 
     End If 

     If oTextBox.Text = "" Then 
      oLabel.Text = "no imput" 
      oLabel.ForeColor = Drawing.Color.Black 

     End If 

     If oTextBox.Text = "server" Then 
      oLabel.Text = "Correct" 
      oLabel.ForeColor = Drawing.Color.Green 
     End If 

     If oTextBox.Text = "Wrong" Then 
      oLabel.Text = "Wrong" 
      oLabel.ForeColor = Drawing.Color.Red 
     End If 

    Next 

End Sub 

Некоторые примечания:

Вам не нужны все эти переменные. Вместо этого просто найдите фактические элементы управления и напрямую взаимодействуйте со свойствами - просто проверьте значение TextBox.Text, когда вам нужно, и сразу установите свойство Label.text. Этот набор особенно важен, поскольку вы хотите обновить исходное свойство управления, чтобы оно отображалось на странице.

Аналогичным образом, вам не нужно Number - вы можете использовать check, так как это ваша переменная подсчета циклов.

Если вы используете оператор + или оператор & для конкатенации строк зависит от вас. Там уже есть good question and several answers here.

Вам также не нужно условие выхода для цикла - цикл выйдет, как только вы достигнете MaxTime. Если вы хотите, чтобы выйти рано, просто разнообразить To состояние (например Currentloop To MaxTime - 1)

UPDATE:

Page.FindControl будет работать только с элементами управления, которые являются непосредственными потомками корневого элемента на странице. Вместо этого вы должны попытаться вызвать FindControl рекурсивно. Вы также должны убедиться, что существует элемент управления с id TextQ1 - посмотрите в источнике HTML для страницы на клиенте, чтобы убедиться, что существует TextBox с этим идентификатором.

Существует много примеров этого в сети. Вот версия VB.Net (источник: http://www.pavey.me/2007/09/recursive-pagefindcontrol-for-vbnet.html), которые вы можете добавить на свою страницу:

Public Function FindControlRecursive(Of ItemType)(ByVal Ctrl As Object, ByVal id As String) As ItemType 
    If String.Compare(Ctrl.ID, id, StringComparison.OrdinalIgnoreCase) = 0 AndAlso TypeOf Ctrl Is ItemType Then 
      Return CType(Ctrl, ItemType) 
    End If 

    For Each c As Control In Ctrl.Controls 
      Dim t As ItemType = FindControlRecursive(Of ItemType)(c, id) 

      If t IsNot Nothing Then 
       Return t 
      End If 
    Next 

    Return Nothing 
End Function 

Ваша линия в коде выше, стали бы тогда:

oTextBox = FindControlRecursive(of TextBox)(Page.Controls(0), "TextQ" & CStr(check))

Вы бы также необходимо сделать то же самое для элемента управления Label.

+0

Привет Даш, я просто попытался это и oTextBox = CType (стр.FindControl («TextQ» + Number), TextBox) im получение ошибки «Преобразование из строки« TextQ »для ввода« Double »недопустимо». что мне делать и спасибо за вашу помощь –

+0

@BennjaminMiles Я немного изменил ответ с первого ответа. Дайте мне знать, как вы поживаете. Перефразируя, однако, 'oTextBox = CType (Page.FindControl (« TextQ »и проверка), TextBox)« может быть более уместным. – dash

+0

Привет, Dash, теперь я изменил код, чтобы проверить, как вы сказали, но это все еще происходит с ошибкой «Преобразование из строки« TextQ »в тип« Double »недопустимо». С уважением Бенджамин Майлз –

0

Это Посмотрите, как вы используете только имя istead из текстового поля попробовать с кодом ниже

Private Sub GoGoGo() 

    Dim Textboxname As String  ' 
    Dim textbox As TextBox 
    Dim TextboxText As Object 
    Dim Labelname As String 
    Dim label As Object 
    Dim LabelText As Object 
    Dim Number As Integer = 1 
    Dim MaxTime As Integer = 9 
    Dim Currentloop As Integer = 1 



For check As Integer = Currentloop To MaxTime 


    If Currentloop <= MaxTime Then 
     Textboxname = "TextQ" + Number 
     textbox = Ctype(Me.Controls(Textboxname), TextBox) 
     TextboxText = textbox.Text 
     textbox.ReadOnly = True 

    End If 

    If Currentloop <= MaxTime Then 
     Labelname = "Label" + Number 
     label = Labelname 
     LabelText = label.Text 
     label.Visible = True 

    End If 

    Number = Number + 1 



    If TextboxText = "" Then 
     label.Text = "no imput" 
     label.ForeColor = Drawing.Color.Black 

    End If 

    If TextboxText = "server" Then 
     label.Text = "Correct" 
     label.ForeColor = Drawing.Color.Green 
    End If 

    If TextboxText = "Wrong" Then 
     label.Text = "Wrong" 
     label.ForeColor = Drawing.Color.Red 
    End If 


    If check = 9 Then 
     Exit For 
    End If 


Next 

End Sub 
+0

Привет, Mandeep, я пробовал это и на «textbox = Ctype (Me.Controls (TextBoxname), TextBox) « Получаю эту ошибку, пожалуйста, сообщите, что преобразование из строки «TextQ1» для ввода «Integer» недопустимо. –

+0

try textbox = Ctype (Me.Controls (key: = Textboxname), TextBox) –