Adding default / initial text to a Textbox - c#

Is it possible to add a "default" text value to a TextBox in WPF, with the text disappearing when the user clicks on the control or types anything in it ?
If it's not possible, how would I create a template which allows a user to define a text box with distinct properties for the content of the control and its initial value?

This is certainly possible. You can either:
1) Set the initial text normally, then on an event such as OnClick() or OnTextSelected() you can delete that text, then it will be blank before they start typing. You can also go one step further and add something to OnTextChanged() to see whether the text is blank and every time there is no content, your initial content can be set again.
2) Alternatively, you can create a custom style for your text block, with a text block inside of it, a property to set the text block text and an event hooked up to clear the text block text. This is nicer, but more work. I would recommend this if you wish to re-use this control.

Related

TextBlock Text property still null after adding Inlines

In a very simple WPF application, I have the following code in the button1_click() method:
textBlock1.Inlines.Add(new Run("TextBlock is designed to be lightweight."));
canvas.Children.Add(textBlock1);
Debug.Print("textBlock1.Text: {0}", textBlock1.Text);
The Debug.Print statement prints nothing for the Text property, but the actual text (i.e. "TextBlock is designed...") is visible in the TextBlock control on the canvas. Why doesn't the Text property depict an exact copy of the Inlines?
PS: There is no data binding, etc. used. The project is very simple, with a TextBlock and a Button on a Canvas inside MainWindow, and minimal XAML; everything is handled in the code-behind.
You can just directly set the Text property of the Textblock. If you have a text that needs special formatting like bold, italic, underline, etc in for each words then that's the time you want to use the Inlines.
If you want to debug the actual Text you want to extract the Run into a separate variable and access its Text property.
var run = new Run("TextBlock is designed to be lightweight");
Debug.Print(run.Text);

Aligning controls inside cells of a TableLayout

In the picture below I have defined a 6-row table layout and placed controls inside its cells, in one cell goes the Label, the other cell for the control its self (a text box for example )
The problem is caused by that field options radio box, it will make the cell so big so then the text box that is under "Preview Data Value" label, goes way below...
How do you suggest fixing this issue?
From my prior experience, I would not use the table layout at all. Instead I would set the anchors on each control to dynamically change with resize.
But if you insist on using the table layout, perhaps you should change the RowSpan attribute of the Preview Data Value cell, and have the label at the top with the text box underneath.
Another option would be to use a container like a GroupBox with a title Attribute that you can set to "Preview Data Value", put the text box in that container and set the "Dock" Attribute to "Fill". Then from the looks of it, you don't even need the last Row.
See this article on MSDN if you want to go totally nuts and implement your own drawing.
Make a seventh row and have the option group span two rows.

How to add text to a textbox and treat it as a block of text?

I want a textbox that it is possible to add "text blocks" to it. The definition of a "text block" is:
Deleting a char in the textbox that is part of a block causing to the whole block to be deleted.
Setting the carot position in the textbox in a location that is part of a block causing to the whole block to be selected.
Any attempt of the user to write a char in a middle of a block will fails followed by an appropriate message box.
I have a DataGridView with a CellClick event attached to it. I want that when the CellClick event is occurs, the content of the cell will be placed in a textbox and will be considered as a text block. The location of the added block will be in the carot position of the textbox or at the end of the textbox if the textbox is not focused and thus the carot is not blinking.
I also want that the textbox could function as a normal textbox, meaning that the user can add or delete any chars/text he want excepts the text blocks that they must be added/deleted completely as defined above.
Maybe I need to use some other GUI controls except textbox to accomplish this mission, I don't know.
I thought about some solutions but I don't know which is the best (maybe none of them):
(remark: each of the following solutions assumes that there is an KeyPress event attached)
Adding hidden characters (if possible) before and after each block to mark it.
Creating a list of objects which represents all the text blocks, each object containing two fiels: startIndex, endIndex. Not so good because adding or deleting chars from the textbox requires to update all the indexes of the blocks located after the added/deleted chars by +1 or -1 for each char.
Creating a list of objects which represents all the text in the textbox, each object containing two fields: text, flag. Each time a char is added manually or a word is added by the event, an object is added to the list and the object's text field is set to the added chars, and the object's flag filed is set to true if the chars are a word added by the event, or false otherwise.
Splitting the textbox to 2 parts and creating a small textbox between them for each text block added by the event, and treating the small textbox diffetently. When the text in the small textbox is deleted the whole textbox control is deleted and the splited textbox is united. Doesn't sounds me so good.
What is the best way to implement this?
Thanks!
I have never seen a control with this behavior. I'm not saying that someone hasn't written one, just that it's unlikely. This means that you're going to have to build it.
If you've never created a custom control, search the web for "creating custom winforms controls" or similar. You first need to understand the basic techniques.
Then you're going to want to know how to store the underlying text for editing. You can start by learning some of the techniques commonly used for standard text-editing controls. Pick one that you can modify for your custom scenario. Here are a few off the top of my head:
Gap Buffer
Rope
Piece Chains
Good luck!

Labels and events!

I have a question? How can I wire up an button in a winform to take an input from a label, and put it in a text box to display the result?
I'm confused!
I have 4 labels... I want to be able to have people put input into the labels click the update button, and then display the results in the textbox below.
Any help? Thank you!
OK so basic outline of what you need to do:
1) Go to the toolbox and put textbox(es) on the form for the user to type in.
2) Add at least one label for your output text
3) Add a Button
4) Select each item on the form, go to its properties (f4) and set the Name property for each one to something that you can remember (this is how you'll reference the controls in your code)
5) Double click on the submit button. This will open up an "Event Handler" for Button.Click, which means the code you write will run when someone clicks the button.
6) Write the C# code to do what you want. For instance, this takes the contents of a textbox (tbInput.Text) and copies it to the label text (lblOutput.Text):
lblOutput.Text = tbInput.Text;
Hope this helps...if not, read the first 3 or 4 chapters of any beginning C# book.
You don't put input input into label, you do that in a TextBox. A label is a as its name implies a "label" (fixed unmodifiable text).
Most simply, create a method to handle the Click event of the button, bind it in.
Inside this method get the text from the labels, and then update the textbox with the input.
.NET standard Labels are not the controls you are looking for. Labels are just that...text labels that do not provide for text input. What you want is a TextBox, which you will be able to find in the Visual Studio Toolbox.
If you want the look and feel of a Label, but the functionality of a TextBox, you can modify the TextBox properties accordingly (border style, background color, etc).
Drop a Button onto your form, and from the Designer if you double-click the button, a _Click event handler will be generated in your source file from which you can implement the code to do whatever it is you want to do.

How to handle multiple instances of input to one field

I want to add a line in a multiline textbox after every information that the user enters in the TextBox in Windows form. I wont be able to determine the point to draw line as I wont know how long the user will enter information. So I am thinking of adding a string "_______" after a button click in the code. Is there a better way?
If the user is going to be required to click a button to confirm a single entry then I don't think you should continue to store the information in the same text box & provide a visual separation with a bunch of dashes, rather move the text entered from the input to a more formatted display (set of controls). Then the display will be separated from input. You could them allow the user to select individual input in the display to modify entry providing a nice user experience.
If you intend to use a regular multiline textbox, printing a line of '-' characters is your best bet. Of course, you could print a line of '─' characters to make the line solid. Another alternative is to use a WebBrowser control, and set its DocumentText property to the HTML you would like to display. This will allow you to append <hr/> whenever you want a dividing line.
You might consider writing a custom control.
You could either paint the control yourself, or use an autosized label and the control's scollbars.

Categories