从母版页selectedItems获取子页面数据

时间:2016-03-07 06:57:59

标签: asp.net vb.net master-pages

我的母版页中有DropdownList。我在我的子页面中设置了控件,该控件从主页面获取属性。现在我正在运行查询

SELECT * FROM table where city like '"+city.text+"'

这里city.text从主页选择的城市中获取价值。但我的问题是它实际上并没有按照city.text显示记录。它显示任何随机记录。

我的代码

母版页

<asp:DropDownList ID="locationSelector" runat="server" AutoPostBack="true">
                        <asp:ListItem Selected>Pune</asp:ListItem>
                        <asp:ListItem>Delhi</asp:ListItem>
                        <asp:ListItem>Chennai</asp:ListItem>
                        <asp:ListItem>Bangalore</asp:ListItem>
                        <asp:ListItem>Mumbai</asp:ListItem>
                    </asp:DropDownList>

子页面VB代码

Dim location As DropDownList = Page.Master.FindControl("locationSelector")
        city.Text = location.SelectedItem.ToString

        If Not IsPostBack Then
            Try
                query = "SELECT * FROM hospitals where city like '" + city.Text + "'"
                Dim cmd As New MySqlCommand(query, con)
                cmd.CommandTimeout = 120
                Dim da As New MySqlDataAdapter(cmd)
                Dim table As New DataTable
                da.Fill(table)
                ViewState("Data") = table
                hospitals.DataSource = table
                hospitals.DataBind()

            Catch ex As Exception
                Response.Write(ex)
            End Try
        End If

更新

Protected Sub hospitals_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Dim location As DropDownList = Page.Master.FindControl("locationSelector")
        city.Text = location.SelectedItem.ToString
    End Sub

有时它也会抛出TimeOut错误。但大部分时间它都会得到结果,但不是按照所选项目。对此有什么其他解决方案?

3 个答案:

答案 0 :(得分:1)

一些提示:

1)超时错误可能由于多种原因而发生,包括网站的大量其他流量,连接池全部用完等等。对于一小部分城市,我可能会在第一个之后将其保留在缓存中调用,这样您就不需要每次都从数据库加载城市列表。根据您所在的国家/地区,如果您只有几千个城市,那么只需将其放入内存列表即可。

2)您正在使用&#34; SELECT *&#34;对于其他开发人员而言,这通常不是很酷,如果表中包含的不仅仅是城市名称,也不是代码。如果您编写从表中选择CityName ,那么您将有效地减少从数据库到您的程序的数据量,并且其他开发人员确切地知道您从哪里开始那张桌子。

3)如果你有一个城市的ID,它可能会表现得更好,因为与匹配几个ID相比,字符串匹配真的很慢。通过用常量替换字符串,我已经看到了20%的速度提升,你不会相信这些天代码中字符串的速度有多慢。

4)最后,我认为您可能已经这样做了,请确保您对每个字段进行INDERE过滤。如果您搜索Hospitals,请确保将Hospitals.City字段编入索引以避免行查找。

我希望(任何)这有助于你:)

答案 1 :(得分:1)

根据我的理解,你需要在下面改变

使用location.SelectedItem.Text代替location.SelectedItem.ToString()

来获取所选的TEXT值
     city.Text = location.SelectedItem.Text // change here

在绑定下拉控件之前检查否。行

if(table.Rows.Count>0)
            {
                hospitals.DataSource = table;
                hospitals.DataBind();
            }

答案 2 :(得分:0)

我建议在页面中使用prerender事件。在prerender事件中,尝试访问您的母版页控件并获取值。