2016-03-07 4 views
2

J'ai l'emplacement DropdownList dans ma page maître. J'ai placé le contrôle dans ma page d'enfant qui prend des propriétés de la page principale. Maintenant, je cours une requêteObtenir des données de page enfant à partir de la page maître selectedItems

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

ici city.text obtient de la valeur de villes maître page sélectionnées. Mais mon problème est qu'il ne montre pas réellement les enregistrements selon city.text a des valeurs dedans. Il montre des enregistrements aléatoires.

Mon code

Maître page

<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> 

page enfant Code 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 

MISE À JOUR

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 

Parfois, il jette également une erreur TimeOut. Mais la plupart du temps Il obtient des résultats mais pas selon les éléments sélectionnés. Quelle sera l'autre solution pour cela?

+0

quel type de contrôle est «hôpitaux» ??? –

Répondre

0

Je suggère d'utiliser l'événement prerender dans la page. Dans l'événement prerender, essayez d'accéder à votre contrôle de page maître et obtenez une valeur.

1

Quelques conseils:

1) erreurs délai d'attente peut se produire pour plusieurs raisons, y compris beaucoup d'autres trafic sur le site, les pools de connexions tous les épuisé, etc. Je voudrais, pour une petite liste des villes , peut-être garder cela dans un cache après le premier appel, de sorte que vous n'avez pas besoin de charger la liste des villes à partir de la base de données à chaque fois. Selon votre pays, si vous ne disposez que de quelques milliers de villes, placez-les simplement dans une liste en mémoire.

2) Vous utilisez un "SELECT *" qui n'est généralement pas vraiment cool pour les autres développeurs, ni pour votre code si la table contient plus qu'un simple nom de ville. SI vous écrivez Sélectionnez CityName dans le tableau, alors vous aurez effectivement réduit la quantité de données allant de votre base de données à votre programme, et il est clair pour les autres développeurs exactement ce que vous tirez de cette table.

3) Si vous avez un identifiant pour la ville, il sera probablement encore plus performant car le matage de la chaîne est TRÈS lent comparé à la correspondance de quelques ID. J'ai vu des améliorations de vitesse de 20% en remplaçant les chaînes avec des constantes, vous ne croiriez pas à quel point les chaînes sont en retard dans le code ces jours-ci.

4) Enfin, et je pense que vous l'avez peut-être déjà fait, assurez-vous que vous INDEXZ tous les champs sur lesquels vous effectuez un filtre WHERE. Si vous recherchez des hôpitaux, assurez-vous que le champ Hospitals.City est indexé pour éviter les recherches de ligne.

J'espère que (tout) cela vous aide :)

+0

vous voulez dire que je devrais créer des cookies de villes. Et une fois que la ville a été sélectionnée pour la première fois, puis obtenir la valeur des villes grâce aux cookies? –

+0

Non Pensez-y comme un singleton dans votre code - la première fois que vous chargez les villes, vous cochez d'abord "Dois-je l'objet de mes villes! = Null?) Et le remplir, côté serveur avec les villes du Les demandes supplémentaires peuvent ensuite faire la même vérification et livrer des villes à partir de votre chose en mémoire :) –

+0

Je suggère d'utiliser l'événement prerender dans la page Dans l'événement prerender, essayez d'accéder à votre contrôle de page maître et d'obtenir la valeur –

1

Selon ma compréhension, vous devez changer ci-dessous

pour récupérer la valeur texte sélectionné usage location.SelectedItem.Text au lieu de location.SelectedItem.ToString()

 city.Text = location.SelectedItem.Text // change here 

avant de lier le contrôle déroulant vérifier le no. de lignes

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