C# .Net

Use of “as” keyword as for casting in C#

2009-01-06

The keyword as doesn’t throw an exception if it fails to complete the casting operation.

Instead it will return null.

Other casting operations will throw an exception when the provided value cannot be casted.

Since the “as” keyword sets or returns “null” value when it fails, the variable you use must be of a reference type or nullable in order to be used with the as keyword. For example, following operation will not be suitable as int is not a nullable type.

int Year = rowYM["year"] as int; // the compiler will reject this because int is non-nullable value type

string FName = dt.Rows[0]["fname"] as string; // this works because string is a reference type

// c# - use of keyword as in csharp


Was this post helpful to you? How can I improve? – Your comment is highly appreciated!

Cassian Menol Razeek


How To Choose Between ItemsSource and DataContext

2012-02-24

I usually use ItemsSource property when I need to databind a control in WPF because it’s straightforward and the framework does everything for me.

However, I came accross a situation where I had to do all data formatting and stuff for a DataGrid. In such a case the best method is to use the DataContext property.

The DataContext property is available for pretty much any item you use under the .net framework because it is implemented in the FrameworkElement. What you need to know about FrameworkElement to understand DataContext is that it is one of the very top level classes in the .net framework class hierarchy which is inherited by many classes beneath it.

The ItemsSource property on the other hand is implemented in the ItemsControl class which is located far below in the .net class hierarchy and therefore only inherited by a sub set of controls you use.

What is DataContext

As the name suggests this property sets the data context for an item. In other words it sets the bigger picture (something similar to saying this text box is should be bound to some data element within this particular data table, but you have to tell me what exactly that element is). So when you set the data context property, then you have to specify databindings explicitly.

Data context is usually used to databind controls such as forms which would include sub controls that need to be bound to sub elements of the data context.

For example, a form would include text boxes for First Name and Last Name. Instead of databinding each control you can set the datacontext property of the form so that both FirstName and LastName textboxes would get relevant data automatically.

Following example shows a simple use of DataContext:

First take a note at the two XAML lines for two text boxes which tells the framework what fields of the datacontext each text box should be bound to


Now following code sets the datacontext of the whole window. (Notice this.DataContext)

// create a simple data source
DataTable _dt = new DataTable();
_dt.Columns.Add(new DataColumn("Id", typeof(int)));
_dt.Columns.Add(new DataColumn("FirstName", typeof(string)));
_dt.Columns.Add(new DataColumn("LastName", typeof(string)));

_dt.Rows.Add(1, "Robin", "Hood");
_dt.Rows.Add(2, "Spider", "Man");
_dt.Rows.Add(3, "Knight", "Rider");

this.DataContext = _dt;

Output

How to use datacontext in WPF - sample use of datacontext


ItemsSource

On the other hand, Items source setting does all the binding work for you so all you have to do is to set the items source property of your control to any collection that implements IEnumerable interface.

Following example shows how you can simply data bind a datagrid using ItemsSource property:


// create a simple data source
DataTable _dt = new DataTable();
_dt.Columns.Add(new DataColumn("Id", typeof(int)));
_dt.Columns.Add(new DataColumn("First Name", typeof(string)));
_dt.Columns.Add(new DataColumn("Last Name", typeof(string)));

_dt.Rows.Add(1, "Robin", "Hood");
_dt.Rows.Add(2, "Spider", "Man");
_dt.Rows.Add(3, "Knight", "Rider");

// DgTestGrid is a dimple datagrid
this.DgTestGrid.ItemsSource = _dt.DefaultView;

Output

How to use itemssource - sample use of itemssource

Note

The data table, _dt is not used straightaway as the items source but its DefaultView is used instead. This is because the DataTable (System.Data.DataTable) class does not implement the IEnumerable interface but its DefaultView (System.Data.Dataview) does.

Was this post helpful to you? How can I improve? – Your comment is highly appreciated!

Cassian Menol Razeek


How to use LIKE operator in Dataview.RowFilter for Date Time or Numaric Fields using CONVERT

2012-01-16

The RowFilter property of the DataView allows to use flexible string similar to SQL or LINQ to easily filter rows wihtout having to iterate through them.

I had to implement a fully flexible search module for a project I’m working on. The user had to be able to perform a string search on any field displayed on the gridview. The above mentioned RowFilter method is really handy to provide such a functionality due to increased efficiency.

Assume following example:

The data table (in the database)

Field Name         Data Type  

Name                String

DateOfBirth        DateTime

Data

Name                     DOB

John                      1976-10-12

Sophie                   1990-12-30

If you want to use the RowFilter to enable flexible searching (i.e. if the user type “j” in the search textbox the search grid view would only show the record for John) you can use following code:

string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("Name LIKE '%", SearchFor, "%'");

This will allow the above explained behaviour so if the user now enter “h” in the textbox it will show both records because both John and Sophie have the letter “h” in their names.

So what if we repeat the same and use the following code for the date of birth field?

// WRONG CODE
string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("DateOfBirth LIKE '%", SearchFor, "%'");

We would expect the program to filter records similarly. However, if you enter “1990″ in the search textbox hoping it would filter Sophie, it would give you an error instead!

This is because the LIKE operator cannot work with non-charactor types.

The Solution!

We have to use a converter to convert the datetime field into a string just before the RowFilter is applied.

Here’s the code:

string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("CONVERT(DateOfBirth, System.String) LIKE '%", SearchFor, "%'");

The Convert function will cast the datetime value into string just before the LIKE operation takes place. And since the datetime value is only temperory converted, the original data are not affected as well.

So if you add this code to the previously worked code for the Name column as described below:

string SearchFor = SearchTextBox.Text;
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("Name LIKE '%", SearchFor, "%'");
((DataView)SearchGrid.DataContext).RowFilter = string.Concat("CONVERT(DateOfBirth, System.String) LIKE '%", SearchFor, "%'");

The Result

Now if you type “John” the grid will only show records that match that value and if you type a digit (e.g. 30) it will show the record that has 30 in the dob field (i.e. the record for Sophie)

Note
You can use the same method for any other field type which doesn’t support use of LIKE directly.

Was this post helpful to you? How can I improve? – Your comment is highly appreciated!

Cassian Menol Razeek


How to auto save the data table in memory into database?

2010-04-01

We frequently get to fetch data from the database, update them and then write them back to the database.

Most of the time we only have to write them back as individual records.

How about updating a whole database table in the memory and having to synchronize all changes to the actual data table?

My initial thought was this would be full of complex coding. However, thanks to Microsoft, there’s nothing much to be done at all.

So how are we gonna do this is…

We will use a data adaptor to fill our data table as usual.

The only new thing is the use of a Command Binder.

Command Binder: A command binder is capable to detect changes that have occurred to a table (in the memory) and then automatically generate appropriate SQL statements to save those changes into the actual data table (in the database).

Following is a simple example: Scenario: In my application I had to take a database table name and present data in a data grid and then save all changes made by the user.

What we need: a data table an adaptor a connection a command builder I have defined them at the form level so I can use them across the form from different events.

private DataTable _tbl;

private SqlDataAdapter _adptr;

private SqlConnection _conn;

private SqlCommandBuilder _cbldr;

Step1: Initialize connection and retrieve data from the database

_tbl = new DataTable();
_conn = FetchData.GetOpenConnection();
_adptr = new SqlDataAdapter("Select * from " + DatabaseTableName, _conn);
_cbldr = new SqlCommandBuilder(_adptr);
_adptr.Fill(_tbl);

Step2: Let the user to change data (in here simply bind the table to a grid)

dgMainGrid.DataSource = _tbl;

Step3: Save (synchronize) changes to the actual database table Even though this is a complex process and undoubtedly would take a lot of effort to do manually, Thanks to .net framework all we need is a line of code.

_adptr.Update(_tbl);

Once you call the adaptor to update the table, it will use the command builder attached to it to generate all necessary SQL command building. The database table is now up-to-date!

Was this post helpful to you? How can I improve? – Your comment is highly appreciated!

Cassian Menol Razeek


  • Visitors Since Oct, 2008
  • Protected By Copyscape Duplicate Content Checker
    Do Not Copy Without Referencing To This Site
  • Copyright © 1996-2010 I Learnt Today.... All rights reserved.
    iDream theme by Templates Next | Powered by WordPress