Похоже, что вы пытаетесь использовать строковый идентификатор элемента управления вместо фактического контроля. Вместо этого вы должны взять этот идентификатор и выполнить поиск фактического элемента управления на странице. Вы можете сделать это с помощью 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.
Привет Даш, я просто попытался это и oTextBox = CType (стр.FindControl («TextQ» + Number), TextBox) im получение ошибки «Преобразование из строки« TextQ »для ввода« Double »недопустимо». что мне делать и спасибо за вашу помощь –
@BennjaminMiles Я немного изменил ответ с первого ответа. Дайте мне знать, как вы поживаете. Перефразируя, однако, 'oTextBox = CType (Page.FindControl (« TextQ »и проверка), TextBox)« может быть более уместным. – dash
Привет, Dash, теперь я изменил код, чтобы проверить, как вы сказали, но это все еще происходит с ошибкой «Преобразование из строки« TextQ »в тип« Double »недопустимо». С уважением Бенджамин Майлз –