Le code ASP.NET côté serveur n'a aucun moyen de percer le navigateur Web et de lui indiquer que de nouvelles données sont disponibles. Vous devrez donc utiliser JavaScript pour interroger le serveur à la recherche de nouvelles données. Il y a plusieurs façons de le faire. Un exemple serait d'utiliser Page Methods sur le serveur qui pourrait dire au client s'il y a plus de données disponibles et quand toutes les données ont été chargées.
[WebMethod]
public static bool IsNewDataAvailable(int currentClientRows)
{
return dataCollectedSoFar.Count > currentClientRows;
}
[WebMethod]
public static bool IsFinished()
{
// return true if all the threads in the thread pool are finished
}
Vous devez appeler la méthode IsNewDataAvailable à intervalles réguliers. Une simple minuterie JavaScript devrait faire l'affaire.
Lorsque de nouvelles données sont disponibles, vous devez effectuer un nouveau rendu du GridView. Encore une fois, il y a plus d'une façon de le faire, mais une façon simple et agréable serait de mettre le GridView à l'intérieur d'un UpdatePanel en même temps qu'un bouton avec un style = "display: none;" attribuer pour le garder caché. Ensuite, s'il y a de nouvelles données disponibles, il suffit d'appeler la méthode de clic JavaScript sur le bouton pour mettre à jour le contenu du panneau de mise à jour.
<script>
var timerId = setInterval("checkForData()", 5000);
function checkForData() {
// If all threads have finished, stop polling
if (PageMethods.IsFinished()) {
clearInterval(timerId);
}
var currentRowCount = 0;
// Find out how many rows you currently have, if
// you have jQuery you could do something like this
currentRowCount = $("#<%= myGridView.ClientID %> tr").length;
if (PageMethods.IsNewDataAvailable(currentRowCount)) {
// Here we trigger the hidden button's click method, again
// using a bit of jQuery to show how it might be done
$("#<%= myHiddenButton.ClientID %>").click();
}
}
</script>
. . .
<asp:UpdatePanel ID="myUpdatePanel" runat="server">
<ContentTemplate>
<asp:GridView ID="myGridView" runat="server">
. . .
</asp:GridView>
<asp:Button ID="myHiddenButton" runat="server" style="display: none;" OnClientClick="myHiddenButton_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Enfin, pour alimenter le GridView du côté du serveur, vous pouvez continuer à utiliser un ThreadPool et juste rendre toutes les données que vous avez à chaque fois. Par exemple:
protected void myHiddenButton_Click(object sender, EventArgs e)
{
myGridView.DataSource = dataCollectedSoFar;
myGridView.DataBind();
}
J'aime ça. Tout ce dont il a besoin est un moyen d'indiquer que toutes les données ont été chargées pour que le navigateur puisse arrêter d'interroger la méthode de la page. –
@Daniel, j'ai recommandé la réponse pour arrêter l'interrogation une fois toutes les données chargées – d4nt