Tampilkan postingan dengan label Events. Tampilkan semua postingan
Tampilkan postingan dengan label Events. Tampilkan semua postingan

Rabu, 20 November 2013

How to Implement Custom Control, Currency TextBox: Windows Forms

Currency Textbox, custom control, as the name implies, will accept only numbers, decimals and control characters. None of other type will be allowed in this textbox. This textbox is basically used to input prices, rates or any measurement including precision.

I have discussed about all the events used to create custom textbox. Open your Visual Studio 2013 Windows Forms project and add a new class named “CurrencyTextBox”, inherit this by System.Windows.Forms.TextBox. Go through the following points, they all together will make this textbox:

Property

Property will be used to get or set the value in the textbox.
private decimal currencyValue;
public decimal CurrencyValue
        {
            get { return currencyValue; }
            set { currencyValue = value; }
        }

Constructor

When the object of this class has been created, by-default it’s value is set to zero, as written in the below c# code.
public CurrencyTextBox()
        {
            currencyValue = 0;
        }

OnKeyPress

What is to be allowed to write in the textbox? Decided in this event. The first line is used to call its base class constructor with specified arguments. After this I have used some if conditions to specify which key is to be accepted or which is not. “e.Handled=true” this line is used to stop the character from being entered into the textbox.
protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != '.')
            {
                e.Handled = true;
            }
            if (e.KeyChar == '.' && this.Text.Contains("."))
            {
                e.Handled = true;
            }
            if (e.KeyChar == '.' && this.Text.Length < 1)
            {
                e.Handled = true;
            }
        }

OnValidated

When the focus is changed, this event will convert the entered value into decimal value. Because currency is used in decimal not string.
protected override void OnValidated(EventArgs e)
        {
            Decimal value = Convert.ToDecimal(this.Text);
            this.Text = value.ToString("C");
        }

OnClick

When the user click on the textbox, it will set the text to currencyValue (property value) and the cursor will be placed at the last of input value.
protected override void OnClick(EventArgs e)
        {
            this.Text = currencyValue.ToString();
            if (this.Text == "0")
                this.Clear();
            this.SelectionStart = this.Text.Length;
        }

OnTextChanged

Change the newly entered value into decimal format.
protected override void OnTextChanged(EventArgs e)
        {
            currencyValue = Convert.ToDecimal(this.Text);
        }

Run your project and in the toolbox a node is added named components followed by project name. You can use this textbox in your project as per your requirements.

Download CurrencyTextBox.cs

Rabu, 07 Agustus 2013

Validating Input Controls in windows forms C#

Data entered by user, should be valid and properly formatted, Otherwise a lot of resources could be wasted in fixing the problems that could be arise due to incorrect data format. Data should be properly checked according to the input criteria. Windows forms provides some ways to validate input in your application.

Masked TextBox Validation

We often requires some data like contact number in a well-defined format and also correct no of digits. This problem can easily be solved by using MaskedTextBox in windows forms. MaskedTextBox displays some formats to the user. If user types a wrong entry then this textbox automatically reject that input.

Just add a MaskedTextBox control and look out the mask property. There are approx. 9 predefined masks such as Phone number, zip code, Numeric digits etc. as in following screenshot:
Mask options of Masked TextBox in windows forms

There is no mask for mobile no in the above masks, so we have to create a new mask. Use the last mask i.e. custom mask and insert ten zero’s in the mask textbox just below the list of mask because mobile no is of ten digits, and our new mask has been created.

Event-Driven Validation

Each input control has a Validating event that occur whenever the control requires data validation. Validating event enables you to prevent from shifting focus from the control being validated to another control until validation has been completed.

To check whether the textbox is blank or not, we will simply check this by using the following line of codes in validating event of textbox in C# language.
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (textBox1.Text == string.Empty)
{
MessageBox.Show("Textbox is empty");
}
}

Just like above code we can validate any other control using some lines of code. There is an argument e of type CancelEventArgs, which can be used to cancel the validating event if required input has been entered by user.
Displaying message when validating the textbox

As in above screenshot if the textbox left empty by the user then a message has been displayed written above. This message can be displayed by any of the message box, status strip etc.

Sabtu, 27 Juli 2013

ListView in windows forms C#

A ListView class displays a list of items with options of text, small and large images. If we look in our windows explorer of windows 8 and view menu in windows 7, there is a view tab in Quick Access Toolbar that have some listview’s options e.g. small icons, large icons, details, tiles etc. We can use the listview control to display data from our database or a text file.

The ListView class often used to display the collection of items in one of these five different views: Small icon, large icon, Tile, List and Details. Small icon and large icon view are simple to understand as items will be displayed as small icon, or large icon in the listview.  Tile view will display item and its subitems as a tile that contains a text information and a large icon. Details view will display item and its subitems in a grid with column headers that shows the information about that item. View List is well known to us as i.e. all the items are shown in a single list.

There are many properties of a listview control. In this post we will go through some most often used properties in C# programming.

  • AllowColumnReorder: user can reorder columns in details view using this property with dragging column headers.
  • CheckBoxes: checkboxes are displayed for each item to allow the user to check the items they want to work on.
  • Columns: get the list of column headers of listview. Only used in details view.
  • GridLines: enable or disable gridlines around the items and subitems. Only used in details view.
  • Scrollable: it shows the scroll bar if there are more items to be fit in client area.
  • TileSize: decide the size of the tile in Tile view.
  • TopItem: used to get or set the first visible item.
  • View: specify how items will be shown according to one of above five different views.

There are more properties of listview which can be easily used with their name in properties window of Visual Studio.

Let’s drag and drop a ListView control in windows form and add following items and finally view these items as large icons. This code is in C# language.
listView1.Items.Add("Item 1");
listView1.Items.Add("Item 2");
listView1.Items.Add("Item 3");
listView1.Items.Add("Item 4");
listView1.Items.Add("Item 5");
when we run this form then it will show the items as:

ListView large icon view

When we want to talk about to show the items in details view then we have to add some columns into this listview. If we will set the details view with above listview items then it will show nothing when we run this form. That’s why there should be some columns to use the details view in listview control. This code is in C# language.

listView1.Columns.Add("column1");
listView1.Columns.Add("column2");
listView1.Columns.Add("column3");

listView1.Items.Add(new ListViewItem(new[] { "value1", "value1", "value1" }));
listView1.Items.Add(new ListViewItem(new[] { "value2", "value2", "value2" }));
listView1.Items.Add(new ListViewItem(new[] { "value3", "value3", "value3" }));

Run this form now then it will show three columns as shown in below screenshot:

ListView details view

We can change some common options at design time as shown in below screenshot:
ListView design time editing

As the properties of listview class there are some events of listview class which occurred when something happens to listview. The most often used event is SelectedIndexChanged that occurs whenever the selected index property of the listview changed. The example of this event is:
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
MessageBox.Show("SelectedIndexChanged event occur");
}
Now every time you change the selected index of listview this message will show in Message Box.

Jumat, 26 Juli 2013

How to Change file attributes in C# Programming

File attributes are metadata associated with computer files that define system behaviour.  Same as files, folders, volumes and other file system objects may have these attributes. All the operating system have often four attributes i.e. archive, hidden, read-only and system. Windows has more attributes. Read more about File Attributes. 

User have to right click on desired file or folder and then open properties, to change the attributes of that file or folder. If one want to change attributes of multiple files then he/she has to either select all the files and then change or change attributes of each file or folder one by one.

In programming context we can do this task with a predefined class i.e. FileAttributes which provides all the attributes for files and directories. We can easily change the desired attribute of a file or directory using the above class FileAttributes that is exists in System.IO namespace.

Design a new form in windows form application that will look like the below form:


Change file attributes in C#

There are some controls which are used for specific task in this project, we will discuss them one by one:
  • TextBox: show the path of folder selected by user.
  • Browse Button: open a folderBrowserDialog which select a path of folders and files.
  • CheckBox: if checked program will check all the sub-folders for files.
Except these controls there are three more buttons which are used to play with attributes of files or folders as their text shows. For example "Remove all" will remove all the attributes of files and folder at selected path.

Write the following code in the click event of Only Hidden button:
private void btnSetHidden_Click(object sender, EventArgs e)
        {
            count = 0;
            setHidden(txtPath.Text);
            lblStatus.Text = "Number Of Scanned Files And Folders:" + count.ToString();
        }
In the above code there is an integer variable count that will count the scanned file and folders. Then it will call a function setHidden(string ) that will use the selected path and set the hidden property to true of all the files and folders at that selected path.


The code of this function is:
private void setHidden(string dir)
{
if (!Directory.Exists(dir))
{
lblStatus.Text = "Invalid path!";
return;
}
if (chkSub.Checked)
{
foreach (string d in System.IO.Directory.GetDirectories(dir))
{
count++;
lblStatus.Text = dir;
setHidden(d);
DirectoryInfo df = new DirectoryInfo(d);

df.Attributes = System.IO.FileAttributes.Hidden;
foreach (string fil in System.IO.Directory.GetFiles(d))
{
FileInfo f = new FileInfo(fil);
f.Attributes = System.IO.FileAttributes.Hidden;
Application.DoEvents();
count++;
}
}
}
}
In above code it will change the attribute of a directory and then all the files in that directory. Here, a new Method doEvents() is used which process all windows messages currently in the message queue. Calling this method causes the current thread to be suspended while all waiting window messages are processed. You can read more about DoEvents().

Go for example.

Sabtu, 29 Juni 2013

Find a control in windows forms

When we drag-n-drop controls in our designer file then we can easily access those controls in our code file directly by its name. But when we dynamically add some controls either in constructor or in load event of form then we can't access them directly in our code.

Let's have an example

  • Add a textbox and a button using drag-n-drop operation on our form i.e. Form1.
  • Leave the name of controls i.e. textBox1 and button1 as they are.
  • Now in constructor add a new textbox dynamically having name "txtBox" with some properties like:

    TextBox txtBox = new TextBox();
    txtBox.Name = "txtBox";
    txtBox.Text = "dynamically added control";
    txtBox.Width = 250;
    txtBox.Location = new Point(10, 10);

    this.Controls.Add(txtBox);
In above code the Name property will be used to find this control. All the remaining properties are familiar to you as in our designer file. At the last we have added this textbox to the form, here the keyword this is pointing Form1.
This form will look like the following screenshot: 

find control in windows form
 

In click event of button when we will try to access above controls then we notice that "textBox1" will be accessed by its name and "txtBox" will not accessed here.

To access these dynamically added controls we have to use a pre-defined method Find(). This method searches the controls by their name and builds an array as in below code.

Control[] controls = this.Controls.Find("txtBox", false);
foreach (var item in controls)
{
     TextBox txtBox = item as TextBox;
     if (txtBox != null)
        MessageBox.Show("control accessed");
}

In above set of code "controls" will hold the array of all the controls having name "txtBox". One by one we will access items of array and check the type of item. If type of item is TextBox then we found our textbox having name "txtBox".

As we know about naming standards of programming that two controls of the same name cannot exists. Keep in mind the above line, and we are sure that, there will only one control named “txtBox” of type TextBox.

Now we will access the above textbox in one line of code i.e.

TextBox txtBox1 = this.Controls.Find("txtBox", false).First() as TextBox;
if (txtBox1 != null)
 MessageBox.Show("control accessed");

When we run our project and click on button then our form look like this.
find control