我有一个转发器控件,其中包含UpdatePanel中的文本框以及其他控件。转发器从SQL数据库中获取数据,当用户对此特定文本框进行更改时,当用户“选中”文本框时会触发 OnTextChange 事件。此事件触发存储过程代码,以使用文本框中的新值更新数据库。我想要实现的功能是当用户选中文本框时,转发器行中的下一个文本框应该集中在 AutoPostBack 触发 OnTextChange 事件。有人会有一个如何使用我在下面提供的代码执行此操作的示例吗?提前谢谢!
表单标记:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Repeater ID="GradeEditor" runat="server">
<ItemTemplate>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="True">
<ContentTemplate>
<asp:Panel ID="Panel1" runat="server" Width="100%" Height="100%">
<table style="width:100%;">
<tr>
<td>
<asp:Label ID="LateLabel" runat="server" CssClass="label label-success" Visible="False"></asp:Label>
</td>
<td> </td>
</tr>
<tr>
<td colspan="2">
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" BackColor="Transparent" BorderColor="Transparent" OnTextChanged="Grade_TextChanged" style="text-align: center" Text='<%# Bind("Grade_Code") %>' Width="100%"></asp:TextBox>
</td>
</tr>
</table>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("ID") %>' Visible="False"></asp:Label>
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("ID") %>' />
<asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Bind("Class_ID") %>' />
<asp:HiddenField ID="HiddenField3" runat="server" Value='<%# Bind("Assignment_ID") %>' />
<asp:HiddenField ID="HiddenField4" runat="server" Value='<%# Bind("Student_ID") %>' />
<asp:HiddenField ID="HiddenField5" runat="server" Value='<%# Bind("Exempt") %>' />
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
更新后面的代码:
Protected Sub Grade_TextChanged(sender As Object, e As EventArgs)
'Find the reference of the Repeater Item.
Dim ScoreText As TextBox = CType(sender, TextBox)
Dim item As RepeaterItem = CType(ScoreText.NamingContainer, RepeaterItem)
Dim ScoreID As Integer = Integer.Parse(TryCast(item.FindControl("HiddenField1"), HiddenField).Value)
Dim ClassID As Integer = TryCast(item.FindControl("HiddenField2"), HiddenField).Value.Trim()
Dim AssignmentID As String = TryCast(item.FindControl("HiddenField3"), HiddenField).Value.Trim()
Dim StudentID As String = TryCast(item.FindControl("HiddenField4"), HiddenField).Value.Trim()
Dim Grade As String = TryCast(item.FindControl("TextBox1"), TextBox).Text
Dim constr As String = ConfigurationManager.ConnectionStrings("AthenaConnectionString").ConnectionString
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand("Scores_CRUD")
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@Action", "UPDATE")
cmd.Parameters.AddWithValue("@Score", Grade)
cmd.Parameters.AddWithValue("@ScoreID", ScoreID)
cmd.Connection = con
con.Open()
cmd.ExecuteNonQuery()
con.Close()
End Using
End Using
Me.BindRepeater()
End Sub
答案 0 :(得分:0)
您在使用UpdatePanel的标记中遇到问题。 UpdatePanel应该在其ContentTemplate中具有Repeater控件,如下面的标记所示。
将您的代码更改为以下内容。
正确标记
library(dplyr)
library(purrr)
library(tidyr)
dat %>%
mutate(score = map(score, ~ if(is.null(.x)) tibble(NA) else as_tibble(.x))) %>%
unnest %>%
select(-`NA`)
# id name rid math
#1 1 Julie NA NA
#2 2 Justin 1 5
#3 2 Justin 2 17
#4 2 Justin 3 19
#5 2 Justin 4 12
#6 2 Justin 5 16
然后,您需要发出JavaScript以从Repeater中的文本框的文本更改事件中聚焦下一个文本框。这可以使用C#代码完成,如下所示。
文字更改了事件C#代码,用于聚焦下一个框
dat <- data.frame(id = 1:2, name = c("Julie", "Justin"),
score = I(list(NULL, data.frame(rid = 1:5,
math = c(5, 17, 19, 12, 16)))), stringsAsFactors = FALSE)