Saturday, July 25, 2009

BackgroundWorker Component

BackgroundWorker Component can be used in situations where long running operations is likely to affect the responsiveness of the UI.

Here I am writing a method within an intention to simulate a delay using Thread Sleep. If I am directly calling the method from button click, the UI will freeze till the operation is complete.
Instead I am using DoWork event of BackgroundWorker Component in conjunction with RunWorkerAsync method.




















using System.Threading
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int arg = (int)e.Argument;
e.Result = Add(arg);
}

private int Add(int ct)
{
int o, j;
o = 0;
j = 1;
int sum = 0;
for(int i = 0 ;i < ct; i++)
{
sum += o + j;
o = j;
j = sum;
Thread.Sleep(1000);
}

return sum;
}

private void btnAdd_Click(object sender, EventArgs e)
{
//int sum = Add(4);
//MessageBox.Show(sum.ToString());
int arg = 4;
backgroundWorker1.RunWorkerAsync(arg);
}

private void btnBlog_Click(object sender, EventArgs e)
{
MessageBox.Show("ShalvinPD.blogspot.com");
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(e.Result.ToString());
}

Saturday, July 4, 2009

Windows Communication Framework (WCF) Introduction

Windows Communication Framework in the Application Programming Interface in .Net 3.x for building Service Oriented Applications.

Create a new project by select WCF Service Application in the New Project Dialog.




















The project comprises of an Interface and a Class File.

















In the interface add Operation Contracts.



















Implement the interface in the Class Service1.cs.




public string Blog()
{
return "ShalvinPD.blogspot.com";
}

public int Add(int i, int j)
{
return i + j;
}







Now run the application.






Consuming the Service

We can consume a WCF service from any UI technologies say Windows Forms, Web Forms, WPF etc.
Go to Project, Add Service Reference.
In the Address copy paste the url from WCF Test Page. Give an appropriate name in the Namespace TextBox.






















Now your are ready to use the service just like consuming a dll.


Shalvin.Service1Client sc = new Shalvin.Service1Client();

private void btnBlog_Click(object sender, EventArgs e)
{
MessageBox.Show(sc.Blog());
}

private void button1_Click(object sender, EventArgs e)
{
int intSum = sc.Add(456, 345);
MessageBox.Show(intSum.ToString());
}









WCFwithout Interface

It is possible to create WCF service without an associated interface file.

[ServiceContract]
public class Service
{
[OperationContract]
public string Blog()
{
    return "ShalvinPD.blogspot.com";
}
[OperationContract]
public int Add(int i, int j)
{
    return i + j;
}
[OperationContract]
public List<string> Students()
{
    List<string> glsStudents = new List<string> { "Shalvin P D", "Praseed Pai", "Mathew K J", "Ashok Shenoy" };
    return glsStudents;
}
}


Silverlight Enabled WCF Service service for example comes without Interface.

Friday, July 3, 2009

PrintDocument and PrintPreview Components and Builing a Reporting Tool

PrintDocument Class defines an object that sends output to a printer used in Windows Forms Application.
First create a Graphics object which essentialy is a drawing surface using the PrintEvenArgs object which is an argument of PrintDocument's PrintPage event.

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
g.DrawString("Shalvin", Font, Brushes.Blue, 50, 50);
g.DrawLine(Pens.Red, 70, 70, 150, 70);

g.DrawRectangle(Pens.Purple, 100, 100, 105, 105);

g.DrawEllipse(Pens.Peru, 125, 125, 130, 130);

g.DrawPie(Pens.PeachPuff, 150, 150, 200, 200, 0, 90);
g.DrawPie(Pens.PaleGreen, 150, 150, 200, 200, 90, 45);
g.DrawPie(Pens.Orange, 150, 150, 200, 200, 135, 135);
g.FillPie(Brushes.AntiqueWhite, 150, 150, 200, 200, 270, 90);

g.FillRectangle(Brushes.Beige, 300, 300, 325, 325);
}

private void Form1_Load(object sender, EventArgs e)
{
printPreviewDialog1.Document = printDocument1;
}

private void btnPrint_Click(object sender, EventArgs e)
{
printPreviewDialog1.ShowDialog();
}





















Reporting Tool
Application development is rarely DrawLine or DrawEllipse. Let's see how to develop a reporting tool with PrintDocument class.

using System.Data.SqlClient;

SqlConnection cnn;
SqlCommand cmd;
SqlDataReader dr;

private void Form1_Load(object sender, EventArgs e)
{
cnn = new SqlConnection("Integrated Security=sspi;Initial Catalog=Northwind");
cnn.Open();
cmd = new SqlCommand("select * from Categories", cnn);
dr = cmd.ExecuteReader();
printPreviewDialog1.Document = printDocument1;
}


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
g.DrawString("Category Id \t\t Category Name \t\t Description", Font, Brushes.Black, 50, 50 );
g.DrawString("___________ \t\t _____________ \t\t ___________", Font, Brushes.Black, 50, 55);
//g.DrawLine(Pens.DarkSlateBlue,50,65,600,65);
int y = 70;
while (dr.Read())
{
g.DrawString(dr["CategoryId"].ToString()+"\t\t\t"+ dr["CategoryName"].ToString()+ "\t\t" + dr["Description"].ToString(), Font,Brushes.Black, 60, y );
y += 20;
}
}


Monday, June 29, 2009

Win32 Api Calls from C#

Here I am demonstrating opening and closing the CD Rom Drive using the win32 api with c#.
This was one of my favourite progam in VB era and so I thought of migrating it to C#.
mciSendString encapsulates the Media Control Interface developed by Microsoft and IBM for controlling the peripherals connected to Windows.

It's better to encapsulate the Win32 api inside a class library. So from the Windows Forms Application add a class library.

using System.Runtime.InteropServices;

namespace OpenCDWindow
{
class OpenCDDoor
{
[DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
public static extern void mciSendStringA(string lpstrCommand,
string lpstrReturnString, long uReturnLength, long hwndCallback);
}
}


Back in the windows forms you can call the win32 api that you have declared in the class.

string rt = "";
private void btnOpen_Click(object sender, EventArgs e)
{
OpenCDDoor.mciSendStringA("set CDAudio door open", rt, 127, 0);
}
private void btnClose_Click(object sender, EventArgs e)
{
OpenCDDoor.mciSendStringA("set CDAudio door closed", rt, 127, 0);
}


VB 6
Module
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

Form
Private Sub CmdClose_Click()
mciSendString "set CDAudio door closed", returnstring, 1, 0
End Sub

Private Sub CmdOpen_Click()
mciSendString "set CDAudio door open", returnstring, 1, 0
End Sub

AnimateWindow Win32 Api
Now we will take up a slightly more complex api which takes a few constatnts.
The AnimateWindow function enables you to produce special effects.
using System.Runtime.InteropServices;

const uint AW_HOR_NEGATIVE = 2;
const uint AW_VER_POSITIVE = 4;
const uint AW_HIDE = 0x10000;


[DllImport("User32.dll")]
static extern bool AnimateWindow(IntPtr hWnd, UInt32 time, UInt32 flags);

private void btnAnimate_Click(object sender, EventArgs e)
{
AnimateWindow(this.Handle, 1000, AW_VER_POSITIVE AW_HOR_NEGATIVE AW_HIDE);
}

WPF Treeview

TreeView is used for displaying hierarchical data. Individual items in a treeview is called TreeViewItem. Here I am declaratively creating a TreeView.




Output





Constructing a treeview with code
private void Window_Loaded(object sender, RoutedEventArgs e)
{
TreeViewItem tvwIndia = new TreeViewItem();
tvwIndia.Header = "India";

treeView1.Items.Add(tvwIndia);

TreeViewItem tvwKerala = new TreeViewItem();
tvwKerala.Header = "Kerala";
tvwIndia.Items.Add(tvwKerala);

TreeViewItem tvwKochi = new TreeViewItem();
tvwKochi.Header = "Kochi";
tvwKerala.Items.Add(tvwKochi);
}


Wednesday, May 20, 2009

WPF Transforms

Transforms allow you to alter the shape of an element.

Here I am using RotateTransform to Rotate the button 45 degrees and SkewTransform to Skew the button.











Output

Tuesday, May 19, 2009

WPF Databinding

Using Silverlight 3 / WPF Databinding any property can be bound to any other property of source using declarative syntax thereby reduce coding drastically.

Here I am binding the Text Property of TextBox to the Value property of Slider.

ElementName property is used to specify the element to use as binding source.

Path is used to specify the source property of binding source.



 <Slider x:Name="slider1" HorizontalAlignment="Left" Height="70" Margin="163,96,0,0" VerticalAlignment="Top" Width="256"/>  
 <TextBox x:Name="textBox"  
      Text="{Binding ElementName=slider1, Path=Value}"  
      HorizontalAlignment="Left" Height="54" Margin="179,225,0,0" TextWrapping="Wrap"   
      VerticalAlignment="Top" Width="185"/>  



Two way Databinding
In the previous example what we saw was One way databinding, ie. as you scroll the slider the value property is reflected in the textbox. But the user can't type a value into textbox and expect the value of slider to get updated.
This is possible by setting the Mode to TwoWay.

Mode=TwoWay.




For Silverlight 3 use TextBlock control instead of TextBox.

We can bind to any Dependency property in the like manner


<Button 
    Margin="5" Content="Click to Toggle" 
    IsEnabled="{Binding IsChecked, Mode=OneWay, 
    ElementName=EnableButton}" />
<CheckBox 
    x:Name="EnableButton" IsChecked="true" 
    Margin="5" Content="Enable Button" />

In this code we are binding the IsEnabled property of Button to the IsChecked propety of CheckBox.

ItemSource Binding
Lets see how to fill a ComboBox with the Font Names and on selecting an item from  the ComboBox the Label's Font is changed.
<ComboBox x:Name="comboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="259" Margin="102,59,0,0" Height="29"
                  ItemsSource="{x:Static Fonts.SystemFontFamilies}" />
<Label Content="Shalvin P D" HorizontalAlignment="Left" VerticalAlignment="Top" RenderTransformOrigin="3.931,6.865" Margin="102,139,0,0" FontFamily="{Binding SelectedItem, ElementName=comboBox}"/>




Binding to a Class

It is possible to bind a control's property to a property of a class. I am going to create a class with a boolean property which denotes the enabled property. Based on the value of the property we are going to set the Enabled property of the class.

class EnabledCheck
{
   public bool IsButtonEnabled { get; set; }
   public EnabledCheck()
   {
      IsButtonEnabled = true;
   }
}

<Window x:Class="WpfDataBindingEg.ButtonClass"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfDataBindingEg"
        Title="ButtonClass" Height="300" Width="300">
    <Window.Resources>
        <local:EnabledCheck x:Key="ButtonState"/>
    </Window.Resources>
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="58,67,0,0" IsEnabled="{Binding IsButtonEnabled, Source={StaticResource ButtonState}}"/>

    </Grid>
</Window>

Related blogs
Silverlight 3, WPF Positioning with ZIndex
Silverlight 3/Wpf : Adding Controls Dynamicallys
Silverlight 3/WPF Templates

Friday, February 27, 2009

Sql Server Stored Procedures

Stored Procedures and block of code which does one or more actions on a database. 


CREATE PROCEDURE spHello as
 PRINT 'Hello welcome to T-Sql'
GO
Executing a stored Procedure
EXEC spHello
Stored Procedure with varchar parameter and string concatenation
create procedure spHelloName (@Name varchar(20))
as 
 print 'Hello ' + @Name
go
Procedure with integer Parameter and addition
Memory variables must preceded with @ symbol
create procedure spAdd(@p1 int, @p2 int)
as
 print @p1 + @p2
go


If

create procedure spIf (@pCity varchar(40))
as
if @pCity = 'Kochi'
 print 'Industrial capital  of Kerala'
go

While Loop
create or alter procedure spWhile
as
DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Hello '
   SET @cnt = @cnt + 1;
END;
GO

While Loop with Cast

create or alter procedure spWhileCounter
as
DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Hello ' + cast(@cnt as varchar(3))
   SET @cnt = @cnt + 1;
END;
GO 


Stored Procedure for Selecting values from a Table

CREATE PROCEDURE spAllCategories
AS
 select * from Categories
GO
spAllCategories


Stored Procedure with Joins
create procedure spAllProductsCategory
as
SELECT C.CategoryName, P.ProductName, P.UnitPrice FROM Categories C , Products P WHERE C.CategoryId = P.CategoryId
go


Stored Procedure with Where Clause
create procedure spProductsCategorySearch(@pCategoryId int)
as
SELECT C.CategoryName, P.ProductName, P.UnitPrice FROM Categories C , Products P WHERE C.CategoryId = P.CategoryId and C.CategoryId = @pCategoryId
go
spProductsCategorySearch 1
spProductsCategorySearch 2


Stored Procedure for Inserting values into a Table
create procedure spInsertCategories (@pCategoryName varchar(40), @pDescription varchar(60))
as
insert into Categories (CategoryName, Description) values (@pCategoryName, @pDescription)
GO

EXEC spInsertCategories @pCategoryName = 'Condiments', @pDescription = 'Sweets and savory sauces, relishes, spreads, and seasonings'spInsertCategories 'Confections', 'Desserts, candies, and sweet breads'


User Managament Scripts
create database UserManagement

use UserManagement

create table Roles(RoleId int identity(1,1) primary key, Role varchar(40))

create table Users (UserId int identity(1,1) primary key,
RoleId int References Roles(RoleId), UserName varchar(40),
Password varchar(40))

create procedure InsertRole(@pRoleName varchar(40))
as
insert into Roles values (@pRoleName)
go

insertRole 'Admin'

create procedure spAllRoles as
select * from Roles
go

create procedure spInsertUser(@pGroupId int,
@pUserName varchar(40), @pPassword varchar(40))
as
insert into Users values (@pGroupId, @pUserName, @pPassword )
go

spInsertUser 1, 'Greorge', 'george'
spAllRoles

create procedure spAllUsers
as
select * from Users
go

spAllUsers

create procedure spUserCount (@pUserName varchar(40), @pPassword varchar(40), @userCount int output)
as
select @userCount = COUNT(*) from Users where UserName = @pUserName and Password =@pPassword
return
go

spUserCount 'George', 'george', ''

create procedure GetUserRole (@pUserName varchar(40))
as
select R.Role from Roles R, Users U where R.RoleId = U.RoleId and U.UserName = @pUserName
go

GetUserRole 'Shalvin'

GetUserRole 'Manu'