在我的ASP.NET内容页面上,我有一个DropDownList和一个DataGrid。当页面加载时,DropDownList将填充SQL查询的结果。我希望从SQL查询的结果中填充DataGrid,但该查询取决于DropDownList的选定项。我有DropDownList1.SelectedIndexChanged的事件处理程序,它调用函数PopulateDG
。此函数从DropDown获取所选项(如果SelectedItem为Nothing,则默认为第一个元素),创建SQLDataAdapter,查询数据库,填充DataSet,最后调用DataGrid的DataBind()
。当从DropDown的事件处理程序调用函数时,这一切都很有效。
我现在想要在首次加载页面时显示DataGrid,使用DropDown的第一个元素中的信息(因为它在用户选择任何内容之前)。我已经尝试将PopulateDG
放在Page和两个控件的Init,PreInit,PreRender,Load和Unload处理程序中,但无济于事。当我使用调试器时,我可以看到ItemsGrid.DataSource确实具有我想要的信息,但ItemsGrid.DataBind似乎不会导致数据网格出现在页面上,就像从SelectedIndexChanged处理程序调用时一样。该控件根本无法呈现到页面上。
PopulateDG:
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)的填充方式与我一样,但是从SelectedItemChanged事件处理程序以外的任何地方调用时,DataBind函数似乎什么都不做。如何在首次加载页面时使其正常工作?