我有一个 gridview,一行有 4 个文本框。用户在第一行的第一个文本框中输入文本。其他文本框是只读的,并根据第一个文本框的值自动填充其值。当我按“enter”或“tab”键时,文本框焦点应该转到第二行的第一个文本框。我怎样才能做到这一点?选项卡索引似乎不起作用。我在 VB.Net 中执行此操作
最佳答案
您可以使用 RoWDataBound
事件来实现此目的:-
更新:
声明一个页面级变量来保存 TabIndex:-
Dim index As Short = 0
RowDataBoundEvent:-
Protected Sub grdCustomer_RowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
index += 1
Dim txtID As TextBox = DirectCast(e.Row.FindControl("txtID"), TextBox)
txtID.TabIndex = index
//Other TextBox(s)
Dim txtName As TextBox = DirectCast(e.Row.FindControl("txtName"), TextBox)
Dim txtCity As TextBox = DirectCast(e.Row.FindControl("txtCity "), TextBox)
txtName.TabIndex = txtCity.TabIndex = -1 //Set TabIndex of Readonly textbox to -1
End If
End Sub
这里的txtID
将是每行中第一个文本框的文本框ID,并将其他文本框TabIndex设置为-1
,这样它们就永远不会获得焦点。
文本框更改事件:-
Protected Sub txtID_TextChanged(sender As Object, e As EventArgs)
Dim txtID As TextBox = CType(sender, TextBox)
//Logic to populate other textbox.
Dim focusIndex As Short = CShort(txtID.TabIndex + 1)
Dim tabbedRow = grdCustomer.Rows.OfType(Of GridViewRow) _
.FirstOrDefault(Function(x) (CType(x.FindControl("txtID"), TextBox)).TabIndex = focusIndex)
If tabbedRow IsNot Nothing Then
tabbedRow.FindControl("txtID").Focus()
End If
End Sub
逻辑:
由于我们已按顺序设置每行中第一个文本框的 TabIndex
,因此在 textChanged 事件中,我找到 TabIndex 等于当前文本框 tabIndex + 1 的文本框,并将焦点设置在该文本框上。
关于javascript - VB.Net 中连续 4 个文本框的 gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33054130/