2013-07-19 3 views
1

J'ai essayé d'obtenir plusieurs résultats dans mon TextBox et je ne peux pas le faire correctement. Quelqu'un pourrait-il me montrer un exemple d'affichage de ce tableau dans une zone de texte?résultats de chaînes dans la zone de texte multiligne

public ArrayList GetUserGroups(string sUserName) 
{ 
    textBox1.Multiline = true; 
    ArrayList myItems = new ArrayList(); 
    UserPrincipal oUserPrincipal = GetUser(sUserName); 

    PrincipalSearchResult<Principal> oPrincipalSearchResult = oUserPrincipal.GetGroups(); 
    textBox1.Multiline = true; 
    foreach (Principal oResult in oPrincipalSearchResult) 
    { 
     myItems.Add(oResult.Name); 
     textBox1.Text = oResult.Name.ToString(); 
    } 
    return myItems; 
} 
+0

Quelle est votre sortie actuelle? ou est-ce que ça sort du tout? – sora0419

+0

Tout d'abord, quelques bonnes pratiques. Votre méthode s'appelle "GetUserGroups". Le faire juste obtenir ces groupes serait une bien meilleure pratique au lieu de l'utiliser pour DisplaySomething. – br1

+0

Ensuite, je pense que nous avons besoin des détails de mise en œuvre de "GetUser" – br1

Répondre

5

Cette ligne

textBox1.Text = oResult.Name.ToString(); 

texte dans overrides la zone de texte chaque fois qu'il est exécuté. Ce que vous pourriez vraiment vouloir faire est d'ajouter chaque nouvelle chaîne au texte qui est déjà dans la zone de texte:

textBox1.Text += oResult.Name.ToString() + Environment.NewLine; 

De plus, si le nombre de principes trouvés est relativement importante, ce qui rend l'utilisation de StringBuilder pourrait vous donner de meilleures performances :

StringBuilder text = new StringBuilder(); 
foreach (Principal oResult in oPrincipalSearchResult) 
{ 
    myItems.Add(oResult.Name); 
    text.Append(oResult.Name); 
    text.AppendLine(); 
} 

textBox1.Text = text.ToString(); 
+0

Hrm. Je pense que vous et moi sommes sur la même longueur d'onde. Vous tapez simplement plus vite. Dangit. – Tim

1

Vous écrasez le texte à chaque fois dans la boucle.

Utilisez la propriété Lines au lieu de Text pour le mode multiligne. (MSDN)

+0

+1 - mais doit également utiliser une chaîne [] au lieu de ArrayList. – SteveLove

+0

@SteveL - true, s'ils veulent assigner 'myItems' à la propriété' Lines', ce qui n'est pas clair à partir du code affiché. – WildCrustacean

1

Dans votre boucle foreach, vous réinitialisez votre texte à chaque fois. Donc, il ne tiendra que la valeur de la boucle finale. Essayez de faire ce que Andrei a mentionné ou vous pouvez ajouter toute réponse à un générateur de chaîne/chaîne et affecter le texte final à la zone de texte.

string str; 
foreach(...){ 
    str += oResult.Name.ToString(); 
} 

textBox1.Text = str; 

OU

StringBuilder sb = new StringBuilder(); 

foreach(...){ 
    sb.Append(oResult.Name.ToString()); 
} 

textBox1.Text = sb.ToString(); 
1

vous configurez simplement à plusieurs reprises la propriété Text de la zone de texte à la dernière oResult.Name.

Au lieu de cela, vous devez l'ajouter. Quelque chose comme

textBox1.Text = textBox1.Text + oResult.Name + Environment.NewLine; 

Cela dit, si vous allez faire une tonne de ceux-ci, vous pourriez envisager d'utiliser un StringBuilder pour des raisons de performance. Quelque chose comme ceci:

StringBuilder tempText = new StringBuilder(); 
foreach (Principal oResult in oPrincipalSearchResult) 
{ 
    myItems.Add(oResult.Name); 
    tempText.Append(oResult.Name.ToString()); 
    tempText.Append(Environment.NewLine); 
} 
textBox1.Text = tempText.ToString(); 
1

Je pense que votre question est ici ..

textBox1.Text = oResult.Name.toString(); 

Dans ce foreach vous assignez la valeur de zone de texte juste la valeur des articles en boucle en cours.

Essayez quelque chose comme

textBox1.Text = textBox1.Text + oResult.Name.ToString(); 

Et aussi, vous faites 2 choses dans cette méthode, de sorte que vous cachez le fait que vous peuplez la zone de texte dans une autre méthode.

1

Cette ligne: textBox1.Text = oResult.Name.ToString();

Si vous passez par chaque Principal de votre collection, vous remplacerez le texte par le dernier Principal. Utilisez la concaténation pour plus de simplicité: textBox1.Text + = '\ n' + oResult.Name.ToString();

Et utilisez la classe StringBuilder si vous êtes préoccupé par les problèmes de ressources ou de performances.

0

GetUserGroups ArrayList publique (string sUserName) {

 ArrayList myItems = new ArrayList(); 
     UserPrincipal oUserPrincipal = GetUser(sUserName); 

     PrincipalSearchResult<Principal> oPrincipalSearchResult = oUserPrincipal.GetGroups(); 
     StringBuilder text = new StringBuilder(); 
     foreach (Principal oResult in oPrincipalSearchResult) 
     { 
      myItems.Add(oResult.Name); 
      text.Append(oResult.Name); 
      text.AppendLine(); 
     } 
     textBox1.Text = text.ToString(); 
     return myItems; 
    } 
0

d'abord au lieu de placer multiligne programmaticly dans le concepteur de sélectionner la zone de texte et cliquez sur la flèche upperright et sélectionnez multiligne puis développez votre zone de texte à la taille désirée, puis boucle à l'intérieur foreach:

foreach (Principal oResult in oPrincipalSearchResult) 
    { 
     myItems.Add(oResult.Name); 
     textBox1.AppendText(oResult.Name + Environment.NewLine); 
    } 

Si vous ne définissez multiligne dans le code de votre zone de texte affiche uniquement la première ligne que vous devez faire placer quelque chose comme ça à côté de voir les résultats textBox1.ScrollBars = ScrollBars.Vertical;, et cela rendrait la zone de texte comme un contrôle numericupdown (puisque vous n'avez pas sélectionné multiline dans le concepteur la zone de texte serait juste la première ligne), et cela n'a pas de sens, alors mieux vaut choisir multiligne dans le concepteur et redimensionner le contrôle en premier.

Questions connexes