【问题标题】:ASP .Net Update individual element on asp page on textchanged postbackASP .Net 在 textchanged 回发的 asp 页面上更新单个元素
【发布时间】:2013-06-07 11:37:13
【问题描述】:

我在一个 webform 视觉工作室项目中有两个网格视图。第一个是一个固定大小的网格,我使用 javascript 设法将其设置为返回一个网格引用,然后将其输出到两个文本框。然后,这些文本框会使用与第一个网格的单击单元格中的数字相关的记录来更新第二个网格:

第一个 gridview 是彩色的,第二个 gridview 是它下面的破折号分隔文本。在示例中,您可以看到选定的单元格引用是 D 和 3a,下面的第二个网格显示了 6 个学生的姓名,单元格 D 3a 中的数字是指的。这很好用。但是,在我多次单击网格后,布局变得混乱:

正如您所见,渲染的标题消失了,这会导致布局问题以及随后的网格参考定位问题。

在第一个 gridview 的数据绑定事件中,我有以下 vbcode 生成在 gridview 上消失的附加标题:

    If gvProgressGrid IsNot Nothing Then
        Dim row As New GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal)

        Dim left As TableCell = New TableHeaderCell()
        left.ColumnSpan = 2
        row.Cells.Add(left)
        left.BorderStyle = BorderStyle.None

        Dim grades As TableCell = New TableHeaderCell()
        grades.ColumnSpan = 10
        grades.Text = "Grades"
        row.Cells.Add(grades)

        Dim cohort As TableCell = New TableHeaderCell()
        cohort.ColumnSpan = 1
        cohort.Text = "Cohort"
        cohort.RowSpan = 2
        cohort.BackColor = Drawing.Color.FromArgb(242, 242, 242)
        row.Cells.Add(cohort)

        Dim expected As TableCell = New TableHeaderCell()
        expected.ColumnSpan = 2

        Select Case strYear
            Case "11"
                expected.Text = "Students achieving expected progress (3 or more levels)"
            Case "10"
                expected.Text = "Students achieving expected progress (2 or more levels)"
            Case "9"
                expected.Text = "Students achieving expected progress (1 or more levels)"
        End Select

        expected.BackColor = Drawing.Color.FromArgb(216, 216, 216)
        expected.Width = 250
        row.Cells.Add(expected)

        Dim above As TableCell = New TableHeaderCell()
        above.ColumnSpan = 2
        Select Case strYear
            Case "11"
                above.Text = "Students achieving above expected progress (4 or more levels)"
            Case "10"
                above.Text = "Students achieving above expected progress (3 or more levels)"
            Case "9"
                above.Text = "Students achieving above expected progress (2 or more levels)"
        End Select
        above.BackColor = Drawing.Color.FromArgb(242, 242, 242)
        above.Width = 250
        row.Cells.Add(above)

        Dim t As Table = TryCast(gvProgressGrid.Controls(0), Table)
        If t IsNot Nothing Then
            t.Rows.AddAt(0, row)
        End If
    End If

我使用我的 javascript 中的以下代码(在点击时获取第一个 gridview 的网格引用的脚本)自动触发第二个文本框的文本更改/失去焦点:

document.getElementById("<%=tbKS2.ClientID%>").value = strKS2;
__doPostBack(document.getElementById("<%=tbKS2.ClientID%>").name, '')  

当单击第一个网格时,只有第二个 gridview 需要更新,并且看起来好像整个页面或至少第一个 gridview 也在更新。

我怎样才能得到它,以便一旦触发上述文本框回发,只有我的第二个 gridview 被更新,页面上的其余元素保持原样呈现?

谢谢。

【问题讨论】:

  • 您是否尝试过在 Page_prerender 事件中运行代码而不是 itemdatabound?
  • @ajakblackgoat 感谢您的浏览。是的,我将代码移至预渲染,但随后出现错误:在删除表变量时,用户代码未处理 argumentoutofrange:Dim t As Table = TryCast(gvProgressGrid.Controls(0), Table)
  • 这意味着此时,您的 gvProgressGrid 还没有任何控件。所以 Controls(0) 会抛出异常。
  • @ajakblackgoat 很酷,所以我应该在页面加载之前绑定 gridview 吗?
  • 只是一个想法,我认为您添加的行和单元格不会在回发中持续存在。我现在仍在测试它。

标签: javascript asp.net vb.net visual-studio-2010 gridview


【解决方案1】:

您需要在网格的 RowCreated 事件期间插入行:

Private Sub gvProgressGrid_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles gvProgressGrid.RowCreated
    If e.Row.RowType = DataControlRowType.Header Then

        ' the rest of your code
        ' ...
        ' ...


    End If

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2013-06-29
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多