programmatic textblock entry with linebreaks - c#

How do I programmatically add text with line breaks to a textblock?
If I insert text like this:
helpBlock.Text = "Here is some text. <LineBreak/> Here is <LineBreak/> some <LineBreak/> more.";
Then the linebreaks get interpreted as part of the string literal. I want it to be more like what would happen if I had it in the XAML.
I can't seem to do it the WPF way either:
helpBlock.Inlines.Add("Here is some content.");
Since the Add() method wants to accept objects of type "inline".
I can't create an Inline object and pass it as a parameter because it is "inaccessible due to its protection level:
helpBlock.Inlines.Add(new Windows.UI.Xaml.Documents.Inline("More text"));
I don't see a way to programmatically add runs.
I can find a ton of WPF examples of this, but nothing for WinRT.
I've also turned up a lot of XAML examples, but nothing from C#.

You could just pass in newline \n instead of <LineBreak/>
helpBlock.Text = "Here is some text. \n Here is \n some \n more.";
Or in Xaml you would use the Hex value of newline
<TextBlock Text="Here is some text.
Here is
some
more."/>
Both results:

Use Enviroment.NewLine
testText.Text = "Testing 123" + Environment.NewLine + "Testing ABC";
StringBuilder builder = new StringBuilder();
builder.Append(Environment.NewLine);
builder.Append("Test Text");
builder.Append(Environment.NewLine);
builder.Append("Test 2 Text");
testText.Text += builder.ToString();

You could convert \n to <LineBreak/> programmatically.
string text = "This is a line.\nThis is another line.";
IList<string> lines = text.Split(new string[] { #"\n" }, StringSplitOptions.None);
TextBlock tb = new TextBlock();
foreach (string line in lines)
{
tb.Inlines.Add(line);
tb.Inlines.Add(new LineBreak());
}

Solution:
I would use "\n" instead of linebreaks. Best way would be use it on this way:
Resources.resx file:
myTextline: "Here is some text. \n Here is \n some \n more."
In yours Class:
helpBlock.Text = Resources.myTextline;
This will looks like:
Other solution would be to build your string here with Environment.NewLine.
StringBuilder builder = new StringBuilder();
builder.Append(Environment.NewLine);
builder.Append(Resources.line1);
builder.Append(Environment.NewLine);
builder.Append(Resources.line2);
helpBlock.Text += builder.ToString();
Or use here "\n"
StringBuilder builder = new StringBuilder();
builder.Append("\n");
builder.Append(Resources.line1);
builder.Append("\n");
builder.Append(Resources.line2);
helpBlock.Text += builder.ToString();

I have one component XAML
<TextBlock x:Name="textLog" TextWrapping="Wrap" Background="#FFDEDEDE"/>
Then I pass the string + Environment.NewLine;
Example:
textLog.Inlines.Add("Inicio do processamento " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + Environment.NewLine);
textLog.Inlines.Add("-----------------------------------" + Environment.NewLine);
The result is
Inicio do processamento 19/08/2019 20:31:13
-----------------------------------

Related

How to output variables to a rich text box one after the other in c#?

void ClearAllRichtextboxes()
{
richTextBox3.Clear();
richTextBox5.Clear();
richTextBox6.Clear();
richTextBox9.Clear();
richTextBox10.Clear();
}
ClearAllRichtextboxes();
if (comboBox5.Text == "Primer")
{
richTextBox5.Text = "This is the number of primer tins" + primer.ToString();
richTextBox6.Text = "This is the cost of the primer tins" + primercost.ToString();
}
if (comboBox3.Text == "Matt")
{
richTextBox10.Text = "This is how many 2.5 tins of paint are needed: " + val44.ToString();
richTextBox9.Text = "This is the matt cost" + valmatt.ToString();
}
if (comboBox3.Text == "Vinyl ")
{
richTextBox10.Text = "This is how many 2.5 tins of paint are needed" + val44.ToString();
richTextBox9.Text = "This is the of vinyl cost" + valmatt.ToString();
}
if (comboBox3.Text =="Silk")
{
richTextBox10.Text = "This is how many 2.5 tins of paint are needed" + silkval.ToString();
richTextBox9.Text = "This is the cost: " + valcostsilk.ToString();
}
Currently I am inserting text into multiple textboxes, instead I would like to output variables in one rich text box - by appending the strings.
You could do something like string formatting to help space the strings with spaces.
something like
richTextBox1.Text = String.Format("This is the number of A in B: {0}\r\n This is the number of X in Y: {1}", output1, output2);
\r\n indicates a new line, you can find more information about the String.Format() method on msdn:
https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx
Update the richTextBox.Text with the new information. If you want to append the new strings to what is already there use "+". You can save the string as its own variable if it helps.
richTextBox.Text = "First segment.";
richTextBox.Text = richTextBox.Text + " Second segment.";
More info about string concatenation: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/how-to-concatenate-multiple-strings

Small Bug When When Appending Text To Multiline Text Box (C#)

i have multiline text box in my form with existing text and I am trying to append text lines on new line and everything works fine but the first line always get added with the existing last line.
Example
text box holds this value
test1
and I am using below code to enter new line
txtMasterResults.AppendText(String.Join(Environment.NewLine, "line 2"));
txtMasterResults.AppendText(String.Join(Environment.NewLine, "line 3"));
and results looks like this
test1line2
line3
how can I fix the first line of textbox so I get the new text from secondline ?
I would retrieve the old string, remove any newlines at the end, and then append the new content. So like this:
txtMasterResults.Text = txtMasterResults.Text.Trim() + "\n" + newText
String.Join joins strings from an array using a delimiter. This is not what you want here.
Use:
txtMasterResults.Text += Environment.NewLine + "line 2" + Environment.NewLine + "line 3";
Note that
txtMasterResults.Text += "something"; is the same as
txtMasterResults.Text = txtMasterResults.Text + "something";

Printing strings in new line (C#)

I have a strange requirement similar to:
string a = #"test content {1} test content {2}"
While printing this, I need the output to be
test content {1}
test content {2}
So, I tried appending \r\n to the string but it prints like below:
string a = "test content {1}\r\n test content {2}\r\n"
Output:
test content {1}\r\n test content {2}\r\n
Why is this behaviour ? Any ideas ?
The problem is in the starting # before your string.
It tells the compiler to escape the string following, so in fact it is this:
string s = "test content {1}\\r\\ntest content {2}"
Remove the # and it will work.
Regarding to the original string - include the linebreaks into the string, the # is important!
string a = #"test content {1}
test content {2}";
And the output wil be:
test content
test content
string a = "test content {1}" + Environment.NewLine + " test content {2}" + Environment.NewLine;
Environment.NewLine escapes one line.
I think the best way is to use StringBuilder class because string are immutables
StringBuilder strb = new StringBuilder();
strb.AppendLine("test content {1}");
strb.Append("test content {2}");
string a = strb.ToString();
the fact that you're using the delimiters WITHIN the string like
string a = "test content {1}\r\n test content {2}\r\n"
tells the code to handle them as a displayable string - surprise!
i'd recommend you to split the string in seperate groups, like
string a = "test content {1}" + Environment.NewLine + "test content {2}";
You could use String.Format() and Environment.NewLine :
String.Format("test content {{1}}{0}test content {{2}}", Environment.NewLine)
Double {} used to escape this characters. {0} to insert Environment.NewLine string.

TextBox MultiLine within winforms application

How to insert a new line in textbox whithin winforms application :
textBox2.Text += "a";
textBox2.Text += "\n";
textBox2.Text += "b";
But the I get one row even I made the textbox multiline :
How can I fix this issue?
Use Environment.NewLine
textbox.Multiline = true;
textbox.Text += "a" + Environment.NewLine + "b";
for Windows OS you should write \r\n for new line.
for Mac OS you should use \n only.
The Environment.NewLine will work for both operating system. Thus, you can make your code common for both platform. So, avoid \n and \r\n in the string when your application code is created for both operating system.
in your case you can use String.Format to avoid multiple concatenation which will slow down the performance when it is being used in long process.
textBox2.Text = String.Format("ABCD{0}XYZ", Environment.NewLine);
if you are concatenating bunch of lines then there is better way to do this. You can use StringBuilder class for that.
StringBuilder sb = new StringBuilder();
foreach(string line in Lines)
{
sb.AppendLine(line);
//or
//sb.AppendFormat("My line: {0}{1}", line, Environment.NewLine);
}
textBox2.Text = sb.ToString();
StringBuilder.AppendLine() can be used also to add lines when you combining more than one lines.
As Brian said you need CRLF which means:
textBox2.Text += "a";
textBox2.Text += "\r\n";
textBox2.Text += "b";
But as Amir correctly said, Environment.NewLine will do the trick as well and you don't have to bother with "how a newline is represented".

How to insert newline in string literal?

In .NET I can provide both \r or \n string literals, but there is a way to insert
something like "new line" special character like Environment.NewLine static property?
Well, simple options are:
string.Format:
string x = string.Format("first line{0}second line", Environment.NewLine);
String concatenation:
string x = "first line" + Environment.NewLine + "second line";
String interpolation (in C#6 and above):
string x = $"first line{Environment.NewLine}second line";
You could also use \n everywhere, and replace:
string x = "first line\nsecond line\nthird line".Replace("\n",
Environment.NewLine);
Note that you can't make this a string constant, because the value of Environment.NewLine will only be available at execution time.
If you want a const string that contains Environment.NewLine in it you can do something like this:
const string stringWithNewLine =
#"first line
second line
third line";
EDIT
Since this is in a const string it is done in compile time therefore it is the compiler's interpretation of a newline. I can't seem to find a reference explaining this behavior but, I can prove it works as intended. I compiled this code on both Windows and Ubuntu (with Mono) then disassembled and these are the results:
As you can see, in Windows newlines are interpreted as \r\n and on Ubuntu as \n
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
One more way of convenient placement of Environment.NewLine in format string.
The idea is to create string extension method that formats string as usual but also replaces {nl} in text with Environment.NewLine
Usage
" X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
gives:
X=1
Y=2
X+Y=3
Code
///<summary>
/// Use "string".FormatIt(...) instead of string.Format("string, ...)
/// Use {nl} in text to insert Environment.NewLine
///</summary>
///<exception cref="ArgumentNullException">If format is null</exception>
[StringFormatMethod("format")]
public static string FormatIt(this string format, params object[] args)
{
if (format == null) throw new ArgumentNullException("format");
return string.Format(format.Replace("{nl}", Environment.NewLine), args);
}
Note
If you want ReSharper to highlight your parameters, add attribute to the method above
[StringFormatMethod("format")]
This implementation is obviously less efficient than just String.Format
Maybe one, who interested in this question would be interested in the next question too:
Named string formatting in C#
string myText =
#"<div class=""firstLine""></div>
<div class=""secondLine""></div>
<div class=""thirdLine""></div>";
that's not it:
string myText =
#"<div class=\"firstLine\"></div>
<div class=\"secondLine\"></div>
<div class=\"thirdLine\"></div>";
If you really want the New Line string as a constant, then you can do this:
public readonly string myVar = Environment.NewLine;
The user of the readonly keyword in C# means that this variable can only be assigned to once. You can find the documentation on it here. It allows the declaration of a constant variable whose value isn't known until execution time.
static class MyClass
{
public const string NewLine="\n";
}
string x = "first line" + MyClass.NewLine + "second line"
newer .net versions allow you to use $ in front of the literal which allows you to use variables inside like follows:
var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
If you are working with Web application you can try this.
StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")
If I understand the question: Couple "\r\n" to get that new line below in a textbox. My example worked -
string s1 = comboBox1.Text; // s1 is the variable assigned to box 1, etc.
string s2 = comboBox2.Text;
string both = s1 + "\r\n" + s2;
textBox1.Text = both;
A typical answer could be s1
s2 in the text box using defined type style.
I like more the "pythonic way"
List<string> lines = new List<string> {
"line1",
"line2",
String.Format("{0} - {1} | {2}",
someVar,
othervar,
thirdVar
)
};
if(foo)
lines.Add("line3");
return String.Join(Environment.NewLine, lines);
Here, Environment.NewLine doesn't worked.
I put a "<br/>" in a string and worked.
Ex:
ltrYourLiteral.Text = "First line.<br/>Second Line.";

Categories