【发布时间】: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