【问题标题】:ASP.NET Load & Display DataGrid based on another control, when page loads页面加载时,基于另一个控件的 ASP.NET 加载和显示 DataGrid
【发布时间】:2016-07-30 02:57:31
【问题描述】:

在我的 ASP.NET 内容页面上,我有一个 DropDownList 和一个 DataGrid。 DropDownList 在页面加载时从 SQL 查询的结果中填充。我希望从 SQL 查询的结果中填充 DataGrid,但该查询取决于 DropDownList 的选定项。我有一个 DropDownList1.SelectedIndexChanged 的​​事件处理程序,它调用函数PopulateDG。该函数从 DropDown 中获取选中项(如果 SelectedItem 为 Nothing,则默认为第一个元素),创建 SQLDataAdapter,查询数据库,填充 DataSet,最后调用 DataGrid 的DataBind()。当从 DropDown 的事件处理程序调用该函数时,这一切都可以完美运行。

我现在希望在第一次加载页面时显示 DataGrid,使用来自 DropDown 的第一个元素的信息(因为它是在用户选择任何内容之前)。我尝试将PopulateDG 放入页面和两个控件的 Init、PreInit、PreRender、Load 和 Unload 处理程序中,但无济于事。当我使用调试器时,我可以看到 ItemsGrid.DataSource 确实有我想要的信息,但 ItemsGrid.DataBind 似乎不会像从 SelectedIndexChanged 处理程序调用时那样导致数据网格出现在页面上。该控件根本不会呈现到页面上。

填充DG:

Protected Sub PopulateDG()
    Dim WeekId As Integer
    Dim DDIdx As Integer
    If DropDownList1.SelectedItem Is Nothing Then
        DDIdx = 0
    Else
        DDIdx = DropDownList1.SelectedIndex
    End If
    WeekId = DropDownList1.Items.Item(DDIdx).Value

    Dim myConnection As SqlConnection
    Dim SQLCommand As SqlDataAdapter

    Dim rootWebConfig As System.Configuration.Configuration
    rootWebConfig = Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/Web.config")
    Dim connString As System.Configuration.ConnectionStringSettings
    connString = rootWebConfig.ConnectionStrings.ConnectionStrings("ConnectionString")
        If Not (connString.ConnectionString = Nothing) Then
            Console.WriteLine("Northwind connection string = " & connString.ConnectionString)
        Else
            Console.WriteLine("No Northwind connection string")
        End If

    myConnection = New SqlConnection(connString.ConnectionString)
    SQLCommand = New SqlDataAdapter("SELECT CONVERT(VARCHAR(10), WorkDate, 101) AS WorkDate, CONVERT(VARCHAR(10), WorkStartTime, 8) AS StartTime, CONVERT(VARCHAR(10), WorkEndTime, 8) AS EndTime, BreakMinutes FROM Days WHERE WeekId = " & WeekId & " ORDER BY WorkDate", myConnection)

    Dim ds As DataSet = New DataSet()
    SQLCommand.Fill(ds)
    ItemsGrid.DataSource = ds
    ItemsGrid.DataBind() 'DEBUGGER BREAK POINT HERE

End Sub

我的 aspx 页面的内容标记:

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" Runat="Server">

      <asp:DropDownList ID="DropDownList1"
          runat="server" 
          DataSourceID="TimeSheetDB" 
          DataTextField="WeekEndLabel" 
          DataValueField="WeekId" 
          OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"
          AutoPostBack="True">
      </asp:DropDownList>
      <asp:SqlDataSource ID="TimeSheetDB" 
          runat="server" 
          ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
          SelectCommand="SELECT [WeekId], 'Week Ending ' + CONVERT(varchar(10), EndDate, 101) AS WeekEndLabel FROM [Weeks] ORDER BY [EndDate]">
      </asp:SqlDataSource>

      <asp:DataGrid id="ItemsGrid"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AutoGenerateColumns="true"
           runat="server"
           >
      </asp:DataGrid>

</asp:Content>

在 sub 的倒数第二行,我有一个断点,使用调试器我可以看到 ItemsGrid.DataSource.Tables.List(0) 完全按照我的意愿填充,但是 DataBind 函数从除 SelectedItemChanged 事件处理程序之外的任何地方调用时似乎什么都不做。页面首次加载时如何使其正常工作?

【问题讨论】:

  • Paul L - 如果您已经解决了自己的问题,最有帮助的操作是添加答案并接受它。这会从未回答的问题列表中删除该问题。
  • 啊,我明白了。我很抱歉。我现在就这样做。

标签: asp.net vb.net visual-studio datagrid event-handling


【解决方案1】:

我发现了问题所在。对 PopulateDG 的调用必须来自 DropDown 的 PreRender 事件处理程序。我的问题似乎是我试图使用该函数太早(即,在项目加载到 DropDown 控件之前)或太晚(在 ASP 已经确定 DataGrid 应该如何出现之后,我假设,所以那时调用 DataBind 没有效果)。显然,我需要详细了解页面和控件的各个执行阶段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2012-01-09
    • 2011-02-22
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多