我有一个函数,它给我一个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调用它(并将实际参数值填充到函数中),它工作正常。这主要是一项帮助我学习的教育练习。
答案 0 :(得分:4)
您正在将richTextBox1
的文本字符串传递给该方法。语句outputData += string.Join(Environment.NewLine, s) + "\n";
将连接文本并创建一个新字符串(字符串是不可变的),但传递的原始文本字符串保持不变。
您需要将结果分配回richTextBox1
:
richTextBox1.Text = FontFinder.FindFeatureSecurityEsc(EscapeSequence.fontEsc12pt,
EscapeSequence.fontDispName, dragDropRichTextBox1.Text, richTextBox1.Text);
当然,在这种情况下,您应该在最后将方法的返回类型从void
更改为string
和return 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中获得结果。这样你甚至不必更改方法的返回类型并将其分配回控件的文本。