在Gridview中创建文本框并添加事件处理程序

时间:2018-05-13 14:59:06

标签: asp.net vb.net ascx

我正在尝试添加"超级标题"行到我的gridview。看来我只能在代码隐藏中做到这一点。在标题中,我想添加一个文本框并附加一个textchange事件处理程序。但是,虽然代码生成标题行和文本框,但它似乎没有附加事件处理程序。这是我的代码:

Protected Sub GridViewBegroting_DataBound(ByVal sender As Object, ByVal e As EventArgs) Handles testGrid.DataBound
    Dim myGridView As GridView = sender
    If myGridView.Controls.Count > 0 Then
        AddSuperHeader(myGridView)
    End If
End Sub

Protected Sub AddSuperHeader(ByVal gridView As GridView)
    Dim myTable As Table = gridView.Controls(0)
    Dim cell As TableHeaderCell = MakeCell("Search", 4)
    Dim tb As HtmlGenericControl = MakeTextBox()
    Dim myNewRow As GridViewRow = New GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal)
    cell.Controls.Add(tb)
    myNewRow.Cells.Add(cell)
    myTable.Rows.AddAt(0, myNewRow)
End Sub

Protected Function MakeTextBox() As HtmlGenericControl
    Dim div1 As HtmlGenericControl = New HtmlGenericControl("div")
    Dim span1 As HtmlGenericControl = New HtmlGenericControl("span")
    Dim tb As TextBox = New TextBox

    AddHandler tb.TextChanged, AddressOf TestGridView_Search
    tb.ID = "testSearchTextBox"
    tb.Attributes("placeholder") = "Search Term"
    div1.Controls.Add(span1)
    div1.Controls.Add(tb)

    Return div1
End Function

Protected Function MakeCell(Optional ByVal text As String = "", Optional ByVal span As Int32 = 1) As TableHeaderCell

    Dim header As New TableHeaderCell()
    header.ColumnSpan = span
    header.Text = text
    header.CssClass = "table-header"
    Return (header)
End Function

Protected Sub TestGridView_Search(ByVal sender As Object, ByVal e As EventArgs)        
        Dim i As Integer = 0        
End Sub

这会创建所有正确的控件,但事件不会触发。没有错误,但TestGridView_Search上的断点不会触发。此外,这是一个用户控件(ASCX)。我试过通过附加一个javascript ajax函数来做到这一点,但这似乎不适用于ASCX文件。

2 个答案:

答案 0 :(得分:0)

ASP.NET只是绑定到.NET框架的标准HTML网页。服务器正在处理您的代码。无论你编码什么,都需要用js(inlc.jquery)和html编写。好吧,当我们使用visual studio在ASP.NET中编码时,我们看不到任何js或html,除了我们在.aspx或代码隐藏文件中编写的内容。也就是说,因为服务器处理我们编写的内容并将必要的js和html添加到请求该页面的客户端的输出流。知道了,我们如何实现事件处理或某些事情的想法,html和js本身不能做什么?通过输入通过js定义的状态回发到服务器。示例:当我们单击文本框文本并进行更改时,我们需要回发到服务器。从asp服务器编写的js和html为我们做了所有这些。我们不必担心这一点。我们只需要记住它的作用。默认情况下,文本框控件的回发设置为false。因为,每当用户使用它时,该页面的js将进行回发。当我们不希望这样时,这不是一个好的用户体验。在您的情况下,这正是我们想要的。所以在我们的代码隐藏文件中(因为控件是在那里生成的),在控件声明中,我们可以将textbox属性AutoPostBack设置为true。这应该有希望解决你的问题。

示例:

textbox.AutoPostBack = True

此致

Maheshvara

答案 1 :(得分:0)

Viewstate不知道您的动态控件,您必须重新构建它:

来源:https://stackoverflow.com/a/6780138/1821637

我会尝试使用asp:Repetaer控件而不是GridView

https://www.aspsnippets.com/Articles/Repeater-control-Tutorial-with-example-in-ASPNet-using-C-and-VBNet.aspx