30
Nov
10

Blog moved to pooran.in

Hi all,

I am moving my blog to www.pooran.in Smile

See you all there!

Pooran

08
Sep
10

Changing log4net log file path via code

Sometimes we might have to place the log files away from the location where the application is installed. And lo there is an option to do that! In the config file create a variable like below

<file type="log4net.Util.PatternString" value="%property{SomeVariable}log.txt" />

And in the code, before calling log4net configure, set the new path to the Variable

log4net.GlobalContext.Properties["SomeVariable"] = YourNewPath;
log4net.Config.XmlConfigurator.Configure();

Simple isn’t it Smile

03
Aug
10

System.ArgumentException: The provided URI scheme ‘file’ is invalid; expected ‘http’.

If you are using Silverlight RIA Services application, you might get this error sometimes. Simple reason is you have set the Silverlight application as a Startup project. When Silverlight project is startup project it will generate a test html page and loads it from file system rather than in http mode. So simple fix is to set the Website that hosts the RIA context as startup project!

Simple isn’t it Smile

03
Jul
10

Silverlight 4 + wpf + RIa services + M-V-VM … deadly mix :)

Working on a prototype that uses Silverlight 4, WPF, RIA services and  MVVM pattern for UI interactions .. looking forward to share some cool findings :)

20
Apr
10

Team foundation server 2010 RTM installation steps, errors and workarounds

If you are planning to install Team Foundation Server on fresh Windows Server 2008 machine follow these steps which I was able to achieve after good number of trail and errors

Hope it saves somebody few frustrating hours :)

24
Mar
10

remove objects from an Enumerable collection in a loop

If you are trying to remove an object from a list that you are currently iterating through like below,

foreach (MyObject myObject in MyListOfMyObjects)
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}

you will get an error message that you cannot do it.

Best alternative is to create a copy of the object and loop through it and remove from main object

foreach (MyObject myObject in new List<MyObject>(MyListOfMyObjects))
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}

Simple isn’t it :)

Source : StackOverflow

12
Mar
10

xml schema generation, serialization & deserialization explained

Lets consider a simple xml named as sample.xml. This can be an xml that you are getting as a output of webservice, a function or just a plain file that you might read in your application.

<users>
    <user>
        <id>1</id>
        <name>asdf</name>
        <fullname>asdf,asdf</fullname>
    </user>
    <user>
        <id>2</id>
        <name>qwer</name>
        <fullname>qwer,qwer</fullname>
    </user>
</users>

Lets create a XML Schema aka XSD file

Open ‘Visual Studio 2008 Command Prompt’ and type in

xsd sample.xml

This will generate sample.xsd file in the folder where you are currently running this command from. Below is how it looks.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="users" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="users" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="user">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="id" type="xs:string" minOccurs="0" />
              <xs:element name="name" type="xs:string" minOccurs="0" />
              <xs:element name="fullname" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Lets create a class for serialization of xml file

xsd sample.xsd /classes /language:cs

This will generate sample.cs file. By default in the generated file, the collection used is Array.

private usersUser[] itemsField;

Lets use ObservableCollection as it is a generic dynamic data collection that provides notifications (using an interface "INotifyCollectionChanged") when items get added, removed, or when the whole collection is refreshed.

Below is how the modified class file looks like.

//——————————————————————————
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3607
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//——————————————————————————

using System.Xml.Serialization;
using System.Collections.ObjectModel;

//
// This source code was auto-generated by xsd, Version=2.0.50727.1432.
//

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class users {

    private ObservableCollection<usersUser> itemsField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("user", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public ObservableCollection<usersUser> Items
    {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class usersUser {
    private string idField;
    private string nameField;
    private string fullnameField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string fullname {
        get {
            return this.fullnameField;
        }
        set {
            this.fullnameField = value;
        }
    }
}

Lets read a file from file system [ Serialization ]. Below is the sample code for doing so

System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
ofd.Multiselect = false;
ofd.Filter = "XML File|*.xml";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    try
    {
        if (File.Exists(ofd.FileName))
        {
        XmlSerializer deserializer = new XmlSerializer(typeof(users));
        TextReader textReader = new StreamReader(ofd.FileName);
        objUsers = new users();
        objUsers = (users)deserializer.Deserialize(textReader);
        textReader.Close();  
        }
    }
    catch
    {
        MessageBox.Show("Not a valid file");
    }
}

To add a new user, below is the sample code

usersUser newuser = new usersUser();
newuser.id = "3";
newuser.name = "zxcv";
newuser.fullname = "zxcv,zxcv";
if (objUsers == null)
    objUsers= new users();
objUsers.Items.Add(newuser);

Lets write a xml file from the objects that we have created [ Deserialization ]. Below is the sample code for doing so

if (objUsers == null)
    objUsers = new users();
SaveFileDialog dlg = new SaveFileDialog();
dlg.FileName = "New";
dlg.DefaultExt = ".xml";
dlg.Filter = "XML file|*.xml";
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
    string filepath = dlg.FileName;
    XmlSerializer serializer = new XmlSerializer(typeof(users));
    TextWriter textWriter = new StreamWriter(filepath);
    serializer.Serialize(textWriter, objUsers);
    textWriter.Close();
}          

Simple isn’t it :)

Sample code explained in this post is available here

11
Mar
10

capturing Barcode scan using C#

Technorati Tags: ,,,

It is know that barcode when scanned, it prints one letter at a time when it is scanning and once scan is complete, it inserts an carriage return at the end.

So barcode scan can be handled via 2 events

1. As it is scanning

Define public variables

public System.Windows.Forms.Timer tmrDelay;

On window Loaded function initialize variables

tmrDelay = new System.Windows.Forms.Timer();
tmrDelay.Interval = 1000;
tmrDelay.Enabled = false;

As we know that barcode when scanned, it prints one letter at a time when it is scanning. So when first letter is entered, start a timer during which the complete barcode will be scanned to the textbox. Once timer is off, you can process it or queue it for processing later.

So, On TextChanged event of the textbox where barcode will be entered, add the following code

private void txtBarcode_TextChanged(object sender, TextChangedEventArgs e)
{
    try
    {
    if (txtBarcode.Text.Trim().Length == 1)
    {
        tmrDelay.Enabled = true;
        tmrDelay.Start();
        tmrDelay.Tick += new EventHandler(tmrDelay_Tick);
    }
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}

void tmrDelay_Tick(object sender, EventArgs e)
{
    try
    {
    tmrDelay.Stop();
    string strCurrentString = txtBarcode.Text.Trim().ToString();
    if (strCurrentString != "")
    {
        //Do something with the barcode entered
        txtBarcode.Text = "";
    }
    txtBarcode.Focus();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}

2. After scan is complete

As we also know that once barcode once scan is complete, it inserts an carriage return at the end.

So, you can look for enter key on KeyUp event of the textbox where barcode will be entered, add the following code

private void txtBarcode_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
    string strCurrentString = txtBarcode.Text.Trim().ToString();
    if (strCurrentString != "")
    {
        //Do something with the barcode entered
        txtBarcode.Text = "";
    }
    txtBarcode.Focus();
    }
}

Choose the one that suits you :)

Simple isn’t it :)

Sample code is available here

15
Feb
10

Switching between Https and http while accessing wcf/asmx service

There may be an instance where we might have to test the clickonce application on production on SSL and stage on port 80, change the url of the wcf/asmx service dynamically etc.

Here is how I fixed the issue

public static MyService.MyServiceSoapClient GetSoapClient()
       {
           MyService.MyServiceSoapClient objClient = new MyService.MyServiceSoapClient();
          //sets the endpoint address dynamically
           objClient.Endpoint.Address = new System.ServiceModel.EndpointAddress(strURLRoot + "services/myservice.asmx");

           //sets the security mode dynamically
           System.ServiceModel.BasicHttpBinding bhbBinding = (System.ServiceModel.BasicHttpBinding)objClient.Endpoint.Binding;
           if (SharedData.strURLRoot.Contains("https:"))
               bhbBinding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
           else
               bhbBinding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.None;
           objClient.Endpoint.Binding = bhbBinding;
           return objClient;
       }

Simple isn’t it?

14
Jan
10

Dependency graph for assembly in Vs 2010 beta 2

In Visual Studio 2010 beta 2, on opening the application, click on ‘Architecture’ menu, you will find ‘Generate Dependency Graph’. On expanding, you will find ‘by assembly’, ‘by namespace’, ‘by class’ and custom.

Select any one that suits your requirement, and explore how your code calls each and every method in the application, how code is dependent on other blocks in the application etc. Using this diagram, you can find orphan classes, methods and functions and you can easily weed them out.

Simple isn’t it :)




@pooran

 

January 2012
M T W T F S S
« Nov    
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

Visits so far..

  • 9,129

Follow

Get every new post delivered to your Inbox.