I'm attempting to create a TimeCard application for employees to be able track their hours through an application instead of having to write down their hours manually. I have a decent amount of textboxes that i need to check.
First, I want to check if the textbox is clicked it will clear the value that is currently in that textbox.
Second, I want to check the textboxes again, if the user clicks out of the textbox and didn't insert any values(hours) in the textbox(blank textbox) it will automatically return the text back to 0(hours).
I am using the 'MouseClick' property to assign all these textboxes. The first part of mode code works correctly.When a user clicks on the box it clears the 0 text that was there before, but I can't figure out how to return that 0 value. Once the textbox is clicked it clears the textbox and leave it blank.I've seen ways that you can do it one at a time, but i'm trying to learn how to code efficiently. Any guidance and help on this situation would be greatly appreciated. Thank You.
Tools: C# / Visual Studio 2012 / Microsoft SQL 2012
private void MainForm_Load(object sender, EventArgs e)
{
foreach (Control control1 in this.Controls)
{
if (control1 is TextBox)
{
control1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.AllTextBoxes_Click);
}
}
}
//Mouse Click Clear
private void AllTextBoxes_Click(object sender, MouseEventArgs e)
{
if ((sender is TextBox))
{
((TextBox)(sender)).Text = "";
}
}
If I understand your requirements, what you actually want is a Watermark/Cue banner implementation.
But since I could be monstruosly wrong, here is an implementation of what you're trying to accomplish.
private void MainForm_Load(object sender, EventArgs e)
{
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
c.GotFocus += deleteContent_GotFocus; // No need for more than that ;)
c.LostFocus += restoreContent_LostFocus;
}
}
}
private void deleteContent_GotFocus(object sender, EventArgs e)
{
if ((sender is TextBox))
{
// Using "as" instead of parenthesis cast is good practice
(sender as TextBox).Text = String.Empty; // hey, use Microsoft's heavily verbosy stuff already! :o
}
}
private void restoreContent_LostFocus(object sender, EventArgs e)
{
if ((sender is TextBox))
{
TextBox tb = sender as TextBox;
if (!String.IsNullOrEmpty(tb.text)) // or String.IsNullOrWhiteSpace
tb.Text = "0";
}
}
Related
i have a windows forms app which i want a certain button to change to enable if the textbox is not empty i tried to compare it to string.Empty but it wont work so i decided to compare to TextLength wont work either ..
Code down below:
private void Form1_Activated(object sender, EventArgs e)
{
if (firstDisplayTxtBox.TextLength > 0)
{
plusButton.Enabled = true;
}
}
mayble i place the if statement in the wrong method Let me know where i am wrong Big Thanks for helpers
Probably, you want to use TextChanged event, which fires every time when text in your firstDisplayTxtBox is changed.
public Form1()
{
InitializeComponent();
firstDisplayTxtBox.TextChanged += OnTextChange;
}
private void OnTextChange(object sender, EventArgs e)
{
plusButton.Enabled = firstDisplayTxtBox.Text.Length > 0
}
or
Similar questions have been already asked (e.g., here), however I've not found an answer for my specific case. I'm building a custom control based on a DevExpress control, which in turns is based on standard TextBox and I've a flickering problem that seems due to the base TextBox component, which tries to update selection.
Without explaining all the details of my custom control, to reproduce the problem you just need to place a TextBox inside a Form and then use this code:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
textBox1.MouseMove += TextBox1_MouseMove;
}
private void TextBox1_MouseMove(object sender, MouseEventArgs e) {
(sender as TextBox).Text = DateTime.Now.Ticks.ToString();
}
}
If you launch it, you click on the TextBox and then you move the cursor toward right you will notice the flickering problem (see video here). For my custom control I would need to avoid this flickering. I'm bound to use a TextBox (so no RichTextBox). Any idea?
The solution has been provided in the meantime by Reza Aghaei by overriding WndProc and intercepting WM_SETFOCUS messages. See here
Depending on what u want to do there are several solutions:
If you want to prevent the selection it would be:
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
(sender as TextBox).Text = DateTime.Now.Ticks.ToString();
(sender as TextBox).SelectionLength = 0;
}
Or for selecting all:
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
(sender as TextBox).Text = DateTime.Now.Ticks.ToString();
(sender as TextBox).SelectAll();
}
And besides that u also could specify the conditions for selecting, for example:
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
(sender as TextBox).Text = DateTime.Now.Ticks.ToString();
if (MouseButtons == MouseButtons.Left) (sender as TextBox).SelectAll();
else (sender as TextBox).SelectionLength = 0;
}
But as long as you want to select the text you always will get some flickering, because a normal Textbox has not the possibility to use things like BeginEdit and EndEdit and so it will change the text first and then select it.
Looking at the video it looks like your textbox is calling WM_ERASEBKGND unnecessarily. In order to remedy this problem you can subclass the textbox class and intercept these messages. Below is sample code which should do the trick (untested) Disclaimer: I have used this technique for other WinForm controls that had the type of flicker shown in your video but not TextBox. If it does work for you, please let me know. Good luck!
// textbox no flicker
public partial class TexttBoxNF : TextBox
{
public TexttBoxNF()
{
}
public TexttBoxNF(IContainer container)
{
container.Add(this);
InitializeComponent();
//Activate double buffering
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
//Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the form's WndProc
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
}
//http://stackoverflow.com/questions/442817/c-sharp-flickering-listview-on-update
protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if (m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}
}
I am creating a program using WinForms so users can input info into textboxes on one form which then are saved into a Listbox on another form. I would like to be able to edit the items saved in the listbox by opening the original form on a button click. Really struggling with it as I can't think of the code and I can't seem to find a solution.
My Code:
private void btnAdd_Click(object sender, EventArgs e)
{
RoomDisplayForm newRoomDisplayForm = new RoomDisplayForm();
newRoomDisplayForm.ShowDialog();
if(newRoomDisplayForm.DialogResult == DialogResult.OK)
{
listBoxRooms.Items.Add(newRoomDisplayForm.value);
}
newRoomDisplayForm.Close();
}
private void btnRemove_Click(object sender, EventArgs e)
{
this.listBoxRooms.Items.RemoveAt(this.listBoxRooms.SelectedIndex);
}
private void btnEdit_Click(object sender, EventArgs e)
{
}
So i've got a Add and Remove button which work perfectly just need a solution to the edit button.
Thanks in advance
I'm guessing newRoomDisplayForm.value is a property or a public member inside the form. You just need to do something like this:
private void btnEdit_Click(object sender, EventArgs e)
{
if(listBoxRooms.SelectedIndex < 0) return;
var tmpValue = listBoxRooms.Items[listBoxRooms.SelectedIndex].ToString();
RoomDisplayForm newRoomDisplayForm = new RoomDisplayForm();
newRoomDisplayForm.value = tmpValue;
newRoomDisplayForm.ShowDialog();
//TODO: inside "newRoomDisplayForm" set the value to the textbox
// ie.: myValueTextBox.Text = this.value;
if(newRoomDisplayForm.DialogResult == DialogResult.OK)
{
// replace the selected item with the new value
listBoxRooms.Items[listBoxRooms.SelectedIndex] = newRoomDisplayForm.value;
}
}
Hope it helps!
You can simply remove the listitem in that specific position, create a new item and add it again. it's kind of replacement.
I've got a program with a lot of text boxes that I've got text in that I want to be cleared on _click and then reset to default if nothing is entered and the user clicks away.
The way I was going to do it is clearly inefficient, having to name the text box each time and I'd like to know how I could go about streamlining it.
this is what I've got at the minute, and I'd have to change the txtUserName for the text box field name each time
private void txtUserName_Click(object sender, EventArgs e)
{
txtUserName.Text = ""
txtUserName.ForeColor = Color.Black;
}
is there a way I can do essentially
private void txtAnyTextBox_Click(object sender, EventArgs e)
{
string caller = //Get this textbox name
this.ClearBoxes(caller)
}
void ClearBoxes(string Caller)
{
Caller.txt.Text = "";
//..... and so on
}
Yes, you can try this (though it's not generic but there is no need for generics in this case):
private void txtAnyTextBox_Click(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
if(tb != null) tb.Text = "";
}
And you can attach this method to all your textBoxes Click event.
textBox1.Click += txtAnyTextBox_Click;
textBox2.Click += txtAnyTextBox_Click;
I don't think this is gonna work:
void ClearBoxes(string Caller)
{
Caller.txt.Text = "";
//..... and so on
}
If you want to use ClearBoxes method you should pass it your TextBox element.But there is no need for this,you can directly clear your textBox as shown above code.
Also if you want to clear all TextBoxes in the same time,for example one button click you can use this:
private void button1_Click(object sender, EventArgs e)
{
foreach (var tBox in this.Controls.OfType<TextBox>())
{
tBox.Text = "";
}
}
You can use the sender argument for that.
private void txtAnyTextBox_Click(object sender, EventArgs e)
{
var textbox = sender as TextBox;
this.ClearTextbox(textbox)
}
private void ClearTextbox(TextBox textbox)
{
textbox.Text = "";
//...
}
You can get name of textbox from sender of event:
private void txtAnyTextBox_Click(object sender, EventArgs e)
{
TextBox textBox = (TextBox)sender;
string caller = textBox.Name;
this.ClearBoxes(caller); // call your custom method
}
If you want to simply clear textbox text, then you don't need to get its name - you can use it's Clear() method:
private void txtAnyTextBox_Click(object sender, EventArgs e)
{
TextBox textBox = (TextBox)sender;
textBox.Clear();
}
Also you can consider creation of custom textbox, which will have some default value and will resent itself to default when clicked:
public class CustomTextBox : TextBox
{
public string DefaultText { get; set; }
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
Text = DefaultText;
}
}
Use custom textboxes instead of default textboxes, and provide DefaultText value for each custom textbox which should reset itself to something more meaningful than empty string (you can use Properties window for that).
This would be quite nasty - as you'd cause a page reload every time someone clicked in the text box.
A far simpler way would be to do it in javascript.
just add a function to clear the text box, and then maybe use a css selector to enable the function for every text box you want to use it in.
e.g.
<input type="text" class="clearme" />
$(".clearme").click(function() {
$(this).val('');
});
this will do it all client side without causing any post backs.
When the user tabs into my NumericUpDown I would like all text to be selected. Is this possible?
private void NumericUpDown1_Enter(object sender, EventArgs e)
{
NumericUpDown1.Select(0, NumericUpDown1.Text.Length);
}
(Note that the Text property is hidden in Intellisense, but it's there)
I wanted to add to this for future people who have been search for Tab and Click.
Jon B answer works perfect for Tab but I needed to modify to include click
Below will select the text if you tab in or click in. If you click and you enter the box then it will select the text. If you are already focused on the box then the click will do what it normally does.
bool selectByMouse = false;
private void quickBoxs_Enter(object sender, EventArgs e)
{
NumericUpDown curBox = sender as NumericUpDown;
curBox.Select();
curBox.Select(0, curBox.Text.Length);
if (MouseButtons == MouseButtons.Left)
{
selectByMouse = true;
}
}
private void quickBoxs_MouseDown(object sender, MouseEventArgs e)
{
NumericUpDown curBox = sender as NumericUpDown;
if (selectByMouse)
{
curBox.Select(0, curBox.Text.Length);
selectByMouse = false;
}
}
You can use this for multiple numericUpDown controls. Just need to set the Enter and MouseDown Events
I was looking around i had the same issue and this Works for me, first select the Item and the second one selects the Text, hope it helps in future
myNumericUpDown.Select();
myNumericUpDown.Select(0, myNumericUpDown.Value.ToString().Length);
I created an extension method to accomplish this:
VB:
<Extension()>
Public Sub SelectAll(myNumericUpDown As NumericUpDown)
myNumericUpDown.Select(0, myNumericUpDown.Text.Length)
End Sub
C#:
public static void SelectAll(this NumericUpDown numericUpDown)
numericUpDown.Select(0, myNumericUpDown.Text.Length)
End Sub
I had multiple numericupdown box's and wanted to achieve this for all. I created:
private void num_Enter(object sender, EventArgs e)
{
NumericUpDown box = sender as NumericUpDown;
box.Select();
box.Select(0, num_Shortage.Value.ToString().Length);
}
Then by associating this function with the Enter Event for each box (which I didn't do), my goal was achieved. Took me a while to figure out as I am a beginner. Hope this helps someone else out
For selecting all text by mouse click or by Tab button I use:
public frmMain() {
InitializeComponent();
numericUpDown1.Enter += numericUpDown_SelectAll;
numericUpDown1.MouseUp += numericUpDown_SelectAll;
}
private void numericUpDown_SelectAll(object sender, EventArgs e) {
NumericUpDown box = sender as NumericUpDown;
box.Select(0, box.Value.ToString().Length);
}
Try
myNumericUpDown.Select(0, myNumericUpDown.Value.ToString().Length);