Repeater Autopostback Textbox焦点位置问题

时间:2018-01-21 00:39:40

标签: asp.net textbox updatepanel repeater

我有一个转发器控件,其中包含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>&nbsp;</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

1 个答案:

答案 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)