string结果成多行文本框

我一直在试图在我的TextBox中得到多个结果,我不能正确的。 有人能告诉我一个显示这个数组到一个文本框的例子吗?

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

这条线

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

每次执行时都会覆盖文本框中的文本。 你真正想要做的是将每个新的字符串附加到已经在文本框中的文本:

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

而且,如果找到的主体数量比较大,使用StringBuilder可能会给你更好的性能:

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

每次通过循环覆盖文本。

对于多行模式,使用Lines属性而不是Text 。 ( MSDN )

在你的foreach循环中,你每次都重置你的文本。 所以它只会保存最终循环的值。

试着做一下Andrei提到的,​​或者你可以把所有的响应追加到字符串/字符串生成器中,并把最终的文本分配给文本框。

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

要么

 StringBuilder sb = new StringBuilder(); foreach(...){ sb.Append(oResult.Name.ToString()); } textBox1.Text = sb.ToString(); 

您只是将文本框的Text属性重复设置为最后的oResult.Name

相反,你需要追加它。 就像是

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

也就是说,如果你将要做大量的这些,你可能会考虑使用StringBuilder出于性能原因。 像这样的东西:

 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(); 

我认为你的问题在这里..

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

在这个foreach中,您只是将文本框的值分配给当前的循环项目值。

尝试类似

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

而且,你在这个方法中做了两件事情,所以你隐藏了一个事实,即你在另一个方法中填充文本框。

这行:textBox1.Text = oResult.Name.ToString();

如果你正在通过你的收藏中的每个委托人,你会把文本替换成最后一个委托人。 为简单起见,使用连接:textBox1.Text + ='\ n'+ oResult.Name.ToString();

如果您担心资源或性能问题,请使用StringBuilder类。

public ArrayList GetUserGroups(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; } 

首先,不要在程序设计器中设置多行,而应选择文本框,然后单击右上方的箭头并选择多行,然后将文本框展开为所需的大小,然后在foreach循环中:

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

如果你只在代码中设置多行,你的文本框将只显示第一行,使你必须放置类似下面的东西来查看结果textBox1.ScrollBars = ScrollBars.Vertical; ,这将使文本框像一个numericupdown控制(因为你没有选择多行设计器中的文本框将只是第一行),这是没有道理的,所以它更好的在你的情况下,在设计器中选择多行,并调整先控制。