控制台输出可见,但richTextBox.Text为空

时间:2015-01-26 18:11:13

标签: c# string winforms

我有一个函数,它给我一个Console.Writeline输出,但它没有将信息写入我的richTextBox。

    public static void FindFeatureSecurityEsc(string[] actualFontName, string displayFontName, string dragDropSourceData, string outputData)
    {
        //Create a list to hold all the fonts
        var listOfDisplayFonts = new List<string>();
        string[] arrayOfDisplayFonts = listOfDisplayFonts.ToArray();

        //Display font name for each font that exists in the dragdrop rich text box.
        if (dragDropSourceData.Contains(actualFontName[0]) || dragDropSourceData.Contains(actualFontName[1]) || dragDropSourceData.Contains(actualFontName[2]))
        {
            //If the font doesn't already exist in the output textbox.
            if (!outputData.Contains(displayFontName))
            {
                //Add font to the output textbox.
                listOfDisplayFonts.Add(displayFontName);
                foreach (string s in listOfDisplayFonts)
                {
                    //Add strings from list to text box.
                    outputData += string.Join(Environment.NewLine, s) + "\n";
                }
                //Clear fonts from the list (They've already been added to the textboxes).
                listOfDisplayFonts.Clear();
            }
        }
        Console.WriteLine(outputData);
    }

在此示例中,outputData等于richTextBox1.Text(最后一个参数)。当我在Main.cs中使用此功能时,这些是参数。

        FontFinder.FindFeatureSecurityEsc(EscapeSequence.fontEsc12pt, EscapeSequence.fontDispName, dragDropRichTextBox1.Text, richTextBox1.Text);

为什么Console.Writeline给我正确的输出,但richTextBox1.Text仍为空?我知道函数是正确的,因为如果我直接从我的Main.cs调用它(并将实际参数值填充到函数中),它工作正常。这主要是一项帮助我学习的教育练习。

4 个答案:

答案 0 :(得分:4)

您正在将richTextBox1的文本字符串传递给该方法。语句outputData += string.Join(Environment.NewLine, s) + "\n";将连接文本并创建一个新字符串(字符串是不可变的),但传递的原始文本字符串保持不变。

您需要将结果分配回richTextBox1

richTextBox1.Text = FontFinder.FindFeatureSecurityEsc(EscapeSequence.fontEsc12pt, 
    EscapeSequence.fontDispName, dragDropRichTextBox1.Text, richTextBox1.Text);

当然,在这种情况下,您应该在最后将方法的返回类型从void更改为stringreturn outputData;

答案 1 :(得分:3)

  

在此示例中,outputData等于richTextBox1.Text(最后一个参数)。

启动时可能具有相同的字符串值,但它不是同一个变量。

你传递了outputData

FindFeatureSecurityEsc(string[] actualFontName, string displayFontName, string dragDropSourceData, string outputData)

然后你修改它一堆,最后把它写到控制台。

Console.WriteLine(outputData);

您永远不会将新的outputData分配回任何控件。

您传入的outputData与您写入控制台的最后一个不同,因为字符串是不可变的。这是一种说法,你不会修改原始字符串,而是创建一个新字符串。

要解决此问题,请将outputData指定给控件。如果有权访问控件,您可以在发布的函数中执行此操作,或者可以返回outputData而不是void返回类型。

答案 2 :(得分:2)

快速修复:

在您的函数结束时,执行此操作(显然也会将返回类型从string更改为void):

return outputData;

所以你的功能变成了:

public static string FindFeatureSecurityEsc(string[] actualFontName, string displayFontName, string dragDropSourceData, string outputData)
{
    // everything the same as before...
    return outputData;
}

然后你可以这样称呼它:

richTextBox1.Text = FontFinder.FindFeatureSecurityEsc(EscapeSequence.fontEsc12pt, 
                    EscapeSequence.fontDispName, dragDropRichTextBox1.Text,
                    richTextBox1.Text);

字符串是不可变的。这意味着无论何时连接或执行任何其他类型的字符串操作,您实际上都在创建新字符串。您的控件的.Text属性仍然指向旧字符串,因此它赢得了&#34;&#34;&#34;&#34;任何改变。

这里的另一种方法是改变你的函数来取代控制而不仅仅是字符串:

public static void FindFeatureSecurityEsc(string[] actualFontName, string displayFontName, string dragDropSourceData, RichTextBox outputDataCtrl)
{
    var outputData = outputDataCtrl.Text;
    // rest of your function as before
    outputDataCtrl.Text = outputData;
}

哪种方法更好取决于你。

答案 3 :(得分:0)

看起来您只使用richTextBox1.Text来显示输出,因为您按值传递它。因此Console.Writeline输出是正确的。如果通过ref传递结果,您将能够在richTextBox.Text中获得结果。这样你甚至不必更改方法的返回类型并将其分配回控件的文本。