2

我只是有一个问题,我希望有人能给我一些指点。我有一个 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

这有点奇怪......你会认为它的默认值是真的......

4

1 回答 1

0

在 PostBack 事件处理例程之后绑定 GridViewPage.LoadComplete或事件。Page.PreRender您还可以尝试让 GridView 将自身与 DataSourceID 和一些 DataSourceControl 绑定。

于 2012-07-06T04:13:40.373 回答