【问题标题】:GridView not populating on Page_Load but on PostBack or RefreshGridView 不在 Page_Load 上填充,但在 PostBack 或 Refresh 上填充
【发布时间】:2015-10-25 19:29:31
【问题描述】:

在 ASP.NET WebForms 应用程序中,一个 aspx 页面中只有两个控件,一个 DropDownList 和一个 GridView。 Page_Load 上的 DropDownList 没有默认选择值。更改 DropDownList 中的选择会准确填充 GridView。

当使用.../View_Details.aspx?C_ID=123等URL参数请求页面时,DropDownList中的选定值会发生变化,但GridView不会首次填充,但刷新页面会显示给定URL参数的记录.

ASPX 标记:

<%@ Page Title="Data" Language="vb" AutoEventWireup="false" MasterPageFile="~/HomePage.Master" CodeBehind="View_Details.aspx.vb" Inherits="App1.View_Details" %>

<asp:Content ID="Content4" ContentPlaceHolderID="BodyCP" runat="server">
<asp:DropDownList ID="CIDCombo" runat="server" DataSourceID="SqlDSCID" DataTextField="CName" DataValueField="CID" AutoPostBack="true"></asp:DropDownList>
<asp:SqlDataSource ID="SqlDSCID" runat="server" ... ></asp:SqlDataSource>

<asp:GridView ID="gvData" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Fld1" />
        <asp:BoundField DataField="Fld2" />
        ...
    </Columns>
</asp:GridView>
</asp:Content>

代码背后:

Private C_ID As Long
Dim con As SqlConnection = New SqlConnection(ConfigurationManager.Connect...)
Dim cmd As New SqlCommand()
Dim stSqlQry As String = ""

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    C_ID = CLng(Request.QueryString("C_ID"))
    If IsPostBack Then

    Else
        If C_ID > 0 Then
            CIDCombo.SelectedValue = C_ID.ToString
            LoadGVData(C_ID)
        End If
    End If
End Sub

Private Sub CIDCombo_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CIDCombo.SelectedIndexChanged
    If CIDCombo.SelectedIndex >= 0 AndAlso CLng(CIDCombo.SelectedValue) > 0 Then
        LoadGVData(CLng(CIDCombo.SelectedValue))
    End If
End Sub

Private Sub LoadGVData(ByVal lnCID As Long)
    Try
        If con.State <> ConnectionState.Open Then con.Open()
        Dim da As SqlDataAdapter = New SqlDataAdapter()
        stSqlQry = "SELECT Fld1, Fld2 ... WHERE CID = @CID"
        da = New SqlDataAdapter()
        cmd = New SqlCommand(stSqlQry, con)
        cmd.Parameters.AddWithValue("@CID", lnCID)
        Dim dtDataTableInc As DataTable = New DataTable("t_Data")
        da.SelectCommand = cmd
        da.Fill(dtDataTableInc)
        'SOME DATA MANIPULATION WITH DATATABLE'

        '****************************************************************************'
        'DEBUG MODE SHOWS DataTable HAS ROWS BUT DON'T SHOW UP FIRST TIME IN GRIDVIEW'
        '****************************************************************************'
        gvData.DataSource = dtDataTableInc
        gvData.DataBind()
    Catch ex As Exception
        'EXCEPTION HANDLING
    Finally
        If con.State <> ConnectionState.Closed Then con.Close()
    End Try
End Sub

【问题讨论】:

  • 既然你说你使用UpdatePanels:如果你不使用它们中的任何一个,网格是否正确填充?
  • 我会让我测试一下,但假设必须使用 UpdatePanels,那么在这种情况下,解决方案可能是什么?
  • 另一个假设:Load 事件是否来得太早而无法绑定您的网格数据?你可以试试 PreRender(或 LoadComplete)事件吗?
  • 不,有UpdatePanel,没有UpdatePanel,在PreRender,LoadComplete中,都不管用。
  • 嗯,这是一个“有趣”的案例......

标签: asp.net vb.net gridview url-parameters


【解决方案1】:

我看到你有 AutoEventWireup="false" 把它设置为 true。

只是一般说明:

使用 DropDownLists 并使用 AutoPostBack=True 使用UpdatePanel,因为当用户总是看到闪烁的白页时会感到沮丧:)

如果您使用UpdatePanel,您将使用Onload 事件来填充您的数据 并输入UpdateMode=Conditional

祝你好运,编码愉快。

【讨论】:

  • 第一次加载页面时(IsPostBack 将始终为 false),DataTable 有记录,然后将其与 DataBind 一起分配给网格应该显示记录。至于 UpdatePanel,这些已经被使用了。我只发布了相关代码。 回发/刷新不是问题。我已经提到问题是第一次加载
  • Okey lemme 想得更远
  • 在 .vb 中创建新的 WebForm 时也给我分配时间:P 非常令人沮丧:P
  • 设置 AutoEventWireup 为真/假,无效
猜你喜欢
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多