1

我一直试图在我的 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;
}
4

8 回答 8

5

这条线

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();
于 2013-07-19T14:31:24.330 回答
1

我想你的问题在这里..

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

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

尝试类似的东西

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

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

于 2013-07-19T14:36:01.970 回答
1

每次循环都覆盖文本。

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

于 2013-07-19T14:32:25.453 回答
1

在您的 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();
于 2013-07-19T14:34:11.877 回答
1

您只是重复将文本框的 Text 属性设置为 last 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();
于 2013-07-19T14:34:18.803 回答
1

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

如果要遍历集合中的每个 Principal,则将文本替换为最后一个 Principal。为简单起见使用连接: textBox1.Text += '\n' + oResult.Name.ToString();

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

于 2013-07-19T14:39:30.083 回答
0

公共 ArrayList GetUserGroups(字符串 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;
    }
于 2013-07-19T14:45:02.400 回答
0

首先,不要在设计器中以编程方式放置多行,而是选择文本框并单击右上角的箭头并选择多行,然后将文本框扩展到所需的大小,然后在 foreach 循环中:

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

如果您只在代码中设置多行,您的文本框将只显示第一行,因此您必须在旁边放置类似的内容才能查看结果textBox1.ScrollBars = ScrollBars.Vertical;,这会使文本框像 numericupdown 控件(因为您没有在设计器中选择多行文本框会只是第一行),这没有意义,因此在您的情况下,最好在设计器中选择多行并首先调整控件的大小。

于 2013-07-19T14:46:54.203 回答