2010-12-02 16 views
0

Hy,À l'aide de C#, comment puis-je mettre à jour les éléments de la listbox d'une autre classe?

Dans mon projet asp.net (C#), j'utilise le threading pour traiter certains messages. J'ai une page d'affichage qui contient une listbox avec toutes les actions qui sont prises dans le traitement du message. Et une classe où je traite le message.

Default.aspx:

 protected void Page_Load(object sender, EventArgs e) 
     { 
      //starts the thread and call the method from Process.cs 
     } 

     public void SetListItem(string text) 
     { 
      myListBox.Items.Add(text); 
      myListBox.DataBind(); 
     } 

Process.cs

public class Process 
{ 
    public Process() 
    { 
    Default defaultPage; 
    defaultPage.SetListItem("==> Received message!"); 
    } 
} 

Mais la zone de liste ne montrent rien. Est-ce que quelqu'un a des idées là où je me trompe? Merci.

Jeff

Répondre

2

Retirez le DataBind

myListBox.DataBind(); 

Vous n'avez pas besoin puisque vous ajoutez un élément à la collection de la liste. Si vous définissiez la propriété DataSource, vous deviez alors l'utiliser. Tout dépend de l'endroit du cycle de vie de votre mise à jour. Il se peut que votre mise à jour soit remplacée par du code ailleurs dans le processus.

En vérité, je considérerais cela comme un fil séparé. Puisque vous avez besoin qu'il soit mis à jour avant que la page ne soumette des informations au navigateur, vous devez soit le garder dans le même thread pour vous assurer qu'il se termine, soit vous aurez besoin d'avoir une sorte de vérification à la fin de votre page exécutant le processus pour s'assurer qu'il a fini. Il est possible que votre thread se termine après le traitement de la page.

+0

non, ce n'est pas bon .. ma listbox n'affiche toujours rien –

0

Une page asp.net, telle que Default génère du code HTML qui est renvoyé au navigateur demandeur. Lorsque ce code HTML a été généré et envoyé au navigateur, il est impossible d'ajouter des éléments côté serveur à tout ce qui est affiché dans le navigateur.

Donc, les threads générateurs qui fonctionnent un peu ne sont pas nécessairement une bonne idée pour votre scénario actuel.

+0

Cela me semble que je dois utiliser un script, comme ajax, pour obtenir mes données de serveur au client –

+0

Yup, c'est certainement une possibilité . –

0

Klaus a raison. Une fois la page dessinée, c'est juste assis là. Donc, pour faire ce que vous voulez faire, exécutez Process dans un thread séparé: Ecrivez votre message de sortie dans Process dans un magasin de données, même si ce n'est que l'ajout à un fichier texte. Ensuite, définissez votre page pour actualiser automatiquement chaque heure X et rechargez votre zone de liste lors du chargement avec le contenu de cette banque de données. Plus tard, quand tout fonctionne, vous pouvez utiliser Ajax pour faire juste l'actualisation de la listbox, au lieu de la page entière.