J'écris actuellement une application WPF 3.5 simple qui utilise le SharePoint C pour effectuer des appels vers SharePoint Sites et générer des informations de groupe et d'utilisateur. Depuis ce processus, je souhaite montrer une barre de progression pendant la génération des groupes. Le processus souhaité est la suivante:
Le problème que je passe est que l'interface utilisateur n'est jamais mise à jour. Ni la barre de progression ni la liste de réception ne changent de modification. Si quelqu'un a des idées pour aider au code ci-dessous, il serait grandement apprécié. P>
private void GetGroupsAndUsersButton_Click(object sender, RoutedEventArgs e) { siteUrl = ""; if (SiteURLTextBox.Text.Length > 0) { FetchDataProgressBar.IsIndeterminate = true; mWorker = new BackgroundWorker(); mWorker.DoWork += new DoWorkEventHandler(worker_DoWork); mWorker.WorkerSupportsCancellation = true; mWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); mWorker.RunWorkerAsync(); } else { System.Windows.MessageBox.Show("Please enter a URL for the SharePoint site you wish to retrieve data"); } } private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { siteUrl = SiteURLTextBox.Text; GroupListView.ItemsSource = null; try { using (SPSite site = new SPSite(siteUrl)) { SPWeb web = site.OpenWeb(); SPGroupCollection collGroups = web.SiteGroups; if (GroupNames == null) GroupNames = new List<string>(); foreach (SPGroup oGroup in collGroups) { GroupListView.Items.Add(new ListViewItem() { Content = oGroup.Name }); } foreach (ListViewItem item in GroupListView.Items) { item.MouseLeftButtonUp += item_MouseLeftButtonUp; } } } catch (Exception ex) { System.Windows.MessageBox.Show("Unable to locate a SharePoint site at: " + siteUrl); } } private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { FetchDataProgressBar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action( delegate() { FetchDataProgressBar.IsIndeterminate = false; } )); }
3 Réponses :
Vous aurez besoin: puis dans votre dowork code> Vous devez appeler: p>
Merci pour votre réponse. Malheureusement, je n'essaie pas de mettre à jour la barre de progression avec une valeur, je veux juste montrer l'animation indéterminée.
Si tel cas, n'avez-vous pas besoin d'appeler l'appel à .isIndeterminate = true; code> comme vous faites l'appel à
.isIndeterminate = false; code>
Au début, vous devez prendre en charge les événements code> ProgressChanged code>. Mettez à jour votre CODE> WORDERWORKER CODE> INITIALISATION TO:
private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; try { using (SPSite site = new SPSite((String)e.Argument)) { SPWeb web = site.OpenWeb(); SPGroupCollection collGroups = web.SiteGroups; if(GroupNames == null) GroupNames = new List<string>(); int added = 0; foreach(SPGroup oGroup in collGroups) { added++; ListViewItem tmp = new ListViewItem() { Content = oGroup.Name }; worker.ReportProgress((added * 100)/collGroups.Count,tmp); } } } catch (Exception ex) { MessageBox.Show("Unable to locate a SharePoint site at: " + siteUrl); } }
Merci pour votre réponse. Malheureusement, aucune mise à jour de l'interface graphique. De plus, tout en débogage, le changement de change de progression n'a jamais été touché. Il se brise immédiatement au travailleur_runworkercompleté (???)
Avez-vous déjà atteint la boucle en essayez / attraper?
Après un petit bricolage, j'ai pu atteindre l'essai / capture en déplaçant le code qui fait référence aux éléments d'interface utilisateur (grouplisteview et SiteurLtextBox) à la touche Cliquez sur l'événement, mais il lance une exception lors de l'initiation de la listeViette: "Le fil d'appel doit être STA, car de nombreux composants de l'interface utilisateur exigent ceci. "
Déplacé la création ListViewItem à l'événement de progression modifié et cela fonctionne comme un charme. Merci pour ton aide!
Dans votre méthode Dowork, vous manipulez des commandes WPF dans le code sur un fil d'arrière-plan, que vous n'êtes pas censé faire. En fait, vous devez recevoir des erreurs comme "Impossible d'accéder au contrôle d'un autre fil". Probablement ces exceptions sont capturées par votre gestionnaire d'erreurs de capture, et peut-être même que la messagerie ne fonctionne pas dans le fil d'arrière-plan. P>
En tant que solution rapide, vous devriez créer des champs de classe SiteurL et Collgroupes, déplacer tout avant l'utilisation du blocage de votre méthode GetGroupSandUserSButton_Click, et tout en commençant par la première boucle de Forache à l'événement de course à exécuter, de sorte que tout code qui accède à des contrôles. fonctionne sur le fil de l'interface utilisateur. P>
Une autre chose que vous devriez changer, c'est que vous ne devez pas créer ListVievems dans le code, mais utilisez plutôt un fichier de données ... Ceci n'est pas connecté à votre problème, cependant. P>