我一直在试图在我的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控制(因为你没有选择多行设计器中的文本框将只是第一行),这是没有道理的,所以它更好的在你的情况下,在设计器中选择多行,并调整先控制。