我只是有一个问题,我希望有人能给我一些指点。我有一个 asp 页面,它以编程方式在同一个 aspx 页面上创建多个网格视图,具体取决于从数据库中检索到的一组变量值。
由于我在后面的代码中以编程方式创建 GridView,我必须在每次页面加载、回发、oninit 等时创建 gridview gridviews。我目前在页面的 OnInit 函数中创建 gridviews。除了当用户进入行编辑模式然后单击更新(行更新)按钮/链接外,这一切都很好。这会强制在网格上进行回发,在更新它们的值之前从数据库重新加载网格值,从而防止 RowUpdating 事件启动。我该如何解决这个问题?我已尝试捕获通过 RowCommand 事件选择的命令,但此事件仅在回发后被触发,因此 oninit 函数在 Rowcommand 之前首先被调用,因此我捕获的命令名称对我几乎没有用处。
我在 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 的 Databind 绑定在页面周围。IsPostback = false 就像我这样做一样,网格只会加载一次,而另一个其他有效的回发,例如当用户单击进入行编辑模式时会导致空网格。
谢谢
感谢一百万 SomeGuy!将 GridView 绑定移动到 Page.PreRender 解决了这个问题。我的事件流曾经是 Page.Oninit(在运行时创建 gridview)-> Page.Load(gridview 绑定)-> GridView.RowUpdating(我将更改提交到数据库)。现在是 Page.OnInit (gridview 创建) -> GridView.RowUpdating (提交对数据库的更改) -> Page.PreRender (gridview 被绑定的地方)。不过现在唯一的问题是我正在通过 iTemplate 为 gridview 的编辑模式渲染一个 ajaxcombobox。调用 GridView.RowUpdating 事件时,用户对此的选择会丢失。所有其他字段(例如文本框)都保留用户输入值。将深入研究这一点,看看我能找到什么。
PS 由于某种原因,我无法将此作为评论发布在您的帖子下...
PPS 修复了 gridview 编辑模式下 Ajax Combobox 的问题。必须将 enableviewstate 设置为 true
将 AjaxComb 调暗为新的 AjaxControlToolkit.ComboBox
AjaxComb.EnableViewState = True
这有点奇怪......你会认为它的默认值是真的......