Asp.net 以编程方式创建GridView,但单击更新时回发会阻止调用行更新

Asp.net 以编程方式创建GridView,但单击更新时回发会阻止调用行更新,asp.net,ajax,gridview,postback,Asp.net,Ajax,Gridview,Postback,我只是有个问题,我希望有人能给我一些建议。我有一个asp页面,它根据从数据库检索到的一组变量值,通过编程在同一个aspx页面上创建多个GridView 由于我在代码隐藏中以编程方式创建GridView,因此每次加载页面、回发、oninit等时,我都必须创建GridView GridView。我当前在页面的oninit函数中创建GridView。除了用户进入行编辑模式,然后单击更新(行更新)按钮/链接外,这一切都可以正常工作。这将强制在网格上进行回发,从而在网格值更新之前从数据库重新加载网格值,从

我只是有个问题,我希望有人能给我一些建议。我有一个asp页面,它根据从数据库检索到的一组变量值,通过编程在同一个aspx页面上创建多个GridView

由于我在代码隐藏中以编程方式创建GridView,因此每次加载页面、回发、oninit等时,我都必须创建GridView GridView。我当前在页面的oninit函数中创建GridView。除了用户进入行编辑模式,然后单击更新(行更新)按钮/链接外,这一切都可以正常工作。这将强制在网格上进行回发,从而在网格值更新之前从数据库重新加载网格值,从而防止RowUpdate事件启动。我该怎么做?我曾尝试捕获通过RowCommand事件选择的命令,但此事件仅在回发后触发,因此在RowCommand之前首先调用oninit函数,因此我捕获的命令名对我没有什么用处

我在Oninit函数中创建GridView,如下所示

    GridViewLineItem = New GridView
    If bEnableEdit = True Then
        GridViewLineItem.AutoGenerateEditButton = True
    End If

    If bEnableDelete = True Then
        GridViewLineItem.AutoGenerateDeleteButton = True
    End If

    GridViewLineItem.AutoGenerateColumns = False
    GridViewLineItem.EnableViewState = True
    GridViewLineItem.Font.Name = "Arial"
    GridViewLineItem.Font.Size = 8
    GridViewLineItem.ForeColor = Drawing.Color.Black
    GridViewLineItem.BackColor = Drawing.Color.White
    GridViewLineItem.BorderColor = Drawing.Color.LightGray
    GridViewLineItem.BorderStyle = BorderStyle.None
    GridViewLineItem.BorderWidth = 1
    GridViewLineItem.CellPadding = 4
    GridViewLineItem.AlternatingRowStyle.BackColor = Drawing.Color.White
    GridViewLineItem.FooterStyle.BackColor = Drawing.Color.BurlyWood
    GridViewLineItem.HeaderStyle.BackColor = Drawing.Color.DarkGray
    GridViewLineItem.HeaderStyle.Font.Bold = True
    GridViewLineItem.HeaderStyle.ForeColor = Drawing.Color.Black
    GridViewLineItem.PagerStyle.BackColor = Drawing.Color.Beige
    GridViewLineItem.PagerStyle.ForeColor = Drawing.Color.Black
    GridViewLineItem.PagerStyle.HorizontalAlign = HorizontalAlign.Right
    GridViewLineItem.RowStyle.BackColor = Drawing.Color.Beige
    GridViewLineItem.ID = "LineItemGridView" + strItemID

    strCBItemID = strItemID



    AddHandler GridViewLineItem.RowEditing, AddressOf GridViewLineItem_RowEditing
    AddHandler GridViewLineItem.RowCancelingEdit, AddressOf GridViewLineItem_RowCancelingEdit
    AddHandler GridViewLineItem.RowDataBound, AddressOf GridViewLineItem_RowDataBound
    AddHandler GridViewLineItem.RowUpdating, AddressOf GridViewLineItem_RowUpdating
    AddHandler GridViewLineItem.PageIndexChanging, AddressOf GridViewLineItem_PageIndexChanging
    AddHandler GridViewLineItem.PreRender, AddressOf GridViewLineItem_PreRender
    AddHandler GridViewLineItem.PageIndexChanged, AddressOf GridViewLineItem_PageIndexChanged
    AddHandler GridViewLineItem.RowDeleting, AddressOf GridViewLineItem_OnDeleting
    AddHandler GridViewLineItem.RowCommand, AddressOf GridViewLineItem_RowCommand



    'bind data source
    dt = New DataTable
    oda = New OleDb.OleDbDataAdapter
    oda.Fill(dt, rsGroup)
    GridViewLineItem.DataSource = dt
    GridViewLineItem.DataBind()

    'Add gridview to page    

    tCell.Controls.Add(GridViewLineItem)
    tRow.Cells.Add(tCell)
    TableLineItem.Rows.Add(tRow)


    LineItemPanel.Controls.Add(TableLineItem)
    LineItemPanel.BorderStyle = BorderStyle.Solid
    LineItemPanel.BorderWidth = 3
    LineItemPanel.BorderColor = Drawing.Color.DarkGray

    tGroupRow = New TableRow
    tGroupCell = New TableCell

    tGroupCell.ColumnSpan = TableGroupDetails.Rows.Item(0).Cells.Count
    tGroupCell.Controls.Add(LineItemPanel)

    tGroupRow.Cells.Add(tGroupCell)


    TableGroupDetails.Rows.Add(tGroupRow)
有人能告诉我当用户点击行更新时,我应该如何跳过gridview的数据绑定吗?我不能不加区别地将Gridview的数据绑定绑定到页面上。IsPostback=false如果我这样做,网格将只加载一次,而其他有效的PostSback(例如,当用户单击进入行编辑模式时)将导致空网格

谢谢

万分感谢!将GridView绑定移动到Page.PreRender解决了此问题。我的事件流过去是Page.Oninit(在运行时创建gridview的地方)->Page.Load(gridview绑定)->gridview.rowUpdate(我提交对数据库的更改的地方)。现在是Page.OnInit(gridview创建)->gridview.rowUpdate(提交对数据库的更改)->Page.PreRender(绑定gridview的位置)。不过现在唯一的问题是,我正在通过iTemplate为gridview的编辑模式渲染一个ajaxcombobox。调用GridView.RowUpdate事件时,用户对此的选择将丢失。所有其他字段(如文本框)保留用户输入值。我将进一步深入研究这一点,看看我能找到什么

另外,由于某些原因,我不能在你的帖子下发表评论

p.p.S修复了gridview编辑模式下Ajax组合框的问题。必须将enableviewstate设置为true

将AjaxComb设置为新的AjaxControlToolkit.ComboBox

AjaxComb.EnableViewState=True


这有点奇怪。。。您可能会认为它的默认值为true…

在回发事件处理例程之后,在
页面上绑定GridView。LoadComplete
页面。PreRender
事件。您还可以尝试让GridView使用DataSourceID和一些DataSourceControl绑定自身。

页面上绑定GridView。加载完成
页面。在回发事件处理例程之后,预呈现
事件。您还可以尝试让GridView与DataSourceID和一些DataSourceControl绑定。

我已经对我的web表单做了进一步的更改。我现在通过OnInit函数在运行时创建Gridview,并绑定到页面加载上的数据集。现在,这将触发RowUpdate事件,但是,当单击gridview中的Update按钮/链接时发生的回发仍然会导致从数据库重新加载数据并覆盖userinput的回发,因此,当我尝试解析gridview中的行值时,我最终会得到用户更改前的值。如何检测何时单击更新以防止重新加载?在Gridview中单击更新链接/按钮时,aspx执行两次回发,第一次是在单击后立即回发。第一次回发发生在任何GridView事件触发之前。在第一次回发之后,aspx将触发OnInit和Page_load事件,这些事件将重新创建并重新加载我的gridview。GridView的RowUpdate事件只触发这两个函数,所有这些都太迟了,因为此时所有用户输入都已丢失。有人有什么建议吗?我已经对我的网页表单做了进一步的修改。我现在通过OnInit函数在运行时创建Gridview,并绑定到页面加载上的数据集。现在,这将触发RowUpdate事件,但是,当单击gridview中的Update按钮/链接时发生的回发仍然会导致从数据库重新加载数据并覆盖userinput的回发,因此,当我尝试解析gridview中的行值时,我最终会得到用户更改前的值。如何检测何时单击更新以防止重新加载?在Gridview中单击更新链接/按钮时,aspx执行两次回发,第一次是在单击后立即回发。第一次回发发生在任何GridView事件触发之前。在第一次回发之后,aspx将触发OnInit和Page_load事件,这些事件将重新创建并重新加载我的gridview。GridView的RowUpdate事件只触发这两个函数,所有这些都太迟了,因为此时所有用户输入都已丢失。有人有什么建议吗?