May 30, 2010

Validations in Devexpress controls

This code shows usage of validations in Devexpress controls.


ASPX Page


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ValidationsDev.aspx.cs" Inherits="ValidationsDev" %>


<%@ Register Assembly="DevExpress.Web.ASPxEditors.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxGridView.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dxg" %>
    <%@ Register Assembly="DevExpress.Web.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxTabControl" TagPrefix="dxtc" %>


    <%@ Register Assembly="DevExpress.Web.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxPanel" TagPrefix="dxp" %>
<%@ Register Assembly="DevExpress.Web.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxRoundPanel" TagPrefix="dxrp" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Validations</title>


    <script src="Common.js" type="text/javascript"></script>


</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%--Textbox validation example--%>
        <dx:ASPxLabel ID="lblSample" Text="Sample" runat="server" />
        <dx:ASPxTextBox ID="txtSample" ClientInstanceName="txtValidate" Width="170px" EnableClientSideAPI="true"
            runat="server" OnValidation="txtSample_Validation">
            <ValidationSettings SetFocusOnError="True" ErrorText="Name must be at least two characters long">
                <ErrorImage Height="16px" Width="16px" AlternateText="Error" />
                <RequiredField IsRequired="True" ErrorText="Name is required" />
                <ErrorFrameStyle ForeColor="Red">
                    <Paddings Padding="3px" PaddingLeft="4px" />
                    <Border BorderColor="#FD4D3E" BorderStyle="Solid" BorderWidth="1px" />
                    <ErrorTextPaddings PaddingRight="3px" />
                </ErrorFrameStyle>
            </ValidationSettings>
            <ClientSideEvents Validation="OnNameValidation" />
        </dx:ASPxTextBox>
        <dx:ASPxLabel ID="lblAge" Text="Age" runat="server" />
        <dx:ASPxTextBox ID="txtAge" ClientInstanceName="txtAge" EnableClientSideAPI="true"
            runat="server" Width="170px" OnValidation="txtAge_Validation">
            <ValidationSettings SetFocusOnError="True" ErrorText="Age must be greater than or equal to 18">
                <ErrorImage Height="16px" Width="16px" AlternateText="Error" />
                <RequiredField IsRequired="True" ErrorText="Age is required" />
                <ErrorFrameStyle ForeColor="Red">
                    <Paddings Padding="3px" PaddingLeft="4px" />
                    <Border BorderColor="#FD4D3E" BorderStyle="Solid" BorderWidth="1px" />
                    <ErrorTextPaddings PaddingRight="3px" />
                </ErrorFrameStyle>
            </ValidationSettings>
            <ClientSideEvents Validation="OnAgeValidation" />
        </dx:ASPxTextBox>
        <%--Combo box example--%>
        <dx:ASPxLabel ID="lblCity" Text="City" runat="server" />
        <dx:ASPxComboBox ID="cmbxCity" runat="server" ValueType="System.String">
            <Items>
                <dx:ListEditItem Text="1" Value="1" />
                <dx:ListEditItem Text="2" Value="2" />
            </Items>
            <ValidationSettings SetFocusOnError="true">
                <RequiredField ErrorText="City reuired" IsRequired="true" />
                <ErrorFrameStyle ForeColor="Red">
                    <Paddings Padding="3px" PaddingLeft="4px" />
                    <Border BorderColor="#FD4D3E" BorderStyle="Solid" BorderWidth="1px" />
                    <ErrorTextPaddings PaddingRight="3px" />
                </ErrorFrameStyle>
            </ValidationSettings>
        </dx:ASPxComboBox>
        <br />
        <%--Get multiple values in combobox--%>
        <dx:ASPxComboBox ID="cmbxMultivalue" runat="server" EnableCallbackMode="True" EnableIncrementalFiltering="True"
            CallbackPageSize="10" ValueField="intGlCode" ValueType="System.String" DataSourceID="SqlDataSource1">
            <Columns>
                <dx:ListBoxColumn FieldName="varAreaName" />
                <dx:ListBoxColumn FieldName="varAreaCode" />
                <dx:ListBoxColumn FieldName="varAreaHead" />
                <dx:ListBoxColumn FieldName="varEmail" />
            </Columns>
        </dx:ASPxComboBox>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:BASF_1111ConnectionString %>"
            SelectCommand="SELECT * FROM [Area_Mst]"></asp:SqlDataSource>
        <%--Get selected values in listbox --%>
        <dx:ASPxListBox ID="lstbxItems" runat="server" SelectionMode="CheckColumn" DataSourceID="SqlDataSource1">
            <Columns>
                <dx:ListBoxColumn FieldName="varAreaName" />
                <dx:ListBoxColumn FieldName="varAreaHead" />
                <dx:ListBoxColumn FieldName="varAreaCode" />
            </Columns>
        </dx:ASPxListBox>
        <%--Gridview on dropdown click--%>
        <dx:ASPxDropDownEdit ID="drpEditTest" runat="server">
            <DropDownWindowTemplate>
                <dxg:ASPxGridView ID="ZoneGrid" DataSourceID="SqlDataSource1" runat="server"
                    KeyFieldName="ID" Width="100%">
                    <columns>
                        <dxg:GridViewDataColumn FieldName="intGlCode" VisibleIndex="0">
                        </dxg:GridViewDataColumn>
                        <dxg:GridViewDataColumn FieldName="varAreaCode" VisibleIndex="1">
                        </dxg:GridViewDataColumn>
                        <dxg:GridViewDataColumn FieldName="varAreaName" VisibleIndex="2">
                        </dxg:GridViewDataColumn>
                        <dxg:GridViewDataTextColumn FieldName="varAreaHead" VisibleIndex="3">
                        </dxg:GridViewDataTextColumn>
                        <dxg:GridViewDataColumn FieldName="varEmail" VisibleIndex="4">
                        </dxg:GridViewDataColumn>
                    </columns>
                </dxg:ASPxGridView>
            </DropDownWindowTemplate>
        </dx:ASPxDropDownEdit>
        <dxg:ASPxGridView ID="ZoneGrid" DataSourceID="SqlDataSource1" runat="server"
            KeyFieldName="ID" Width="100%">
            <columns>
                <dxg:GridViewDataColumn FieldName="intGlCode" VisibleIndex="0">
                </dxg:GridViewDataColumn>
                <dxg:GridViewDataColumn FieldName="varAreaCode" VisibleIndex="1">
                </dxg:GridViewDataColumn>
                <dxg:GridViewDataColumn FieldName="varAreaName" VisibleIndex="2">
                </dxg:GridViewDataColumn>
                <dxg:GridViewDataTextColumn FieldName="varAreaHead" VisibleIndex="3">
                </dxg:GridViewDataTextColumn>
                <dxg:GridViewDataProgressBarColumn FieldName="Complete" VisibleIndex="4" PropertiesProgressBar-ShowPosition="true">                    
                </dxg:GridViewDataProgressBarColumn>
                <dxg:GridViewDataColumn FieldName="varEmail" VisibleIndex="5">
                </dxg:GridViewDataColumn>
            </columns>
         </dxg:ASPxGridView>
         <dxrp:ASPxRoundPanel ID="rndpnlSample" runat="server" ShowHeader="False">
            <PanelCollection>
                <dxp:PanelContent>
                    <dxtc:ASPxTabControl runat="server" ID="tbSample" DataSourceID="XmlDataSource1">                        
                    </dxtc:ASPxTabControl> 
                    <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/XMLFile.xml">
                    </asp:XmlDataSource>
                </dxp:PanelContent>
            </PanelCollection>
         </dxrp:ASPxRoundP nel>
    </div>
    </form>
</body>
</html>



Code behind page


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


public partial class ValidationsDev : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {


    }
    protected void txtSample_Validation(object sender, DevExpress.Web.ASPxEditors.ValidationEventArgs e)
    {
        if ((e.Value as string).Length < 2)
            e.IsValid = false;
    }
    protected void txtAge_Validation(object sender, DevExpress.Web.ASPxEditors.ValidationEventArgs e)
    {       
        string strAge = ((string)e.Value).TrimStart('0');
        if (strAge.Length == 0)
            return;
        UInt32 age = 0;
        if (!UInt32.TryParse(strAge, out age) || age < 18)
            e.IsValid = false;
    }
}

May 10, 2010

Insert/Add, Update, Edit, Delete in ASPXgridview - Devexpress

This code demonstrates how to Add/Insert, Update, delete, edit in Devexpress aspxgridview. Sorting and changing position of columns is by default enabled. Only to disable it you need to specify.

Note : You can download Devexpress controls from www.devexpress.com

I have tried this with versions 9.2.3 and 9.3.2. For example purpose I have used connection strings and queries in same file but for you, you need to retrieve it from web.config file and also use stored procedures.


Aspx Page



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridviewWithAddUpdateEditDelete.aspx.cs" Inherits="GridviewWithDelete" %>


<%@ Register Assembly="DevExpress.Web.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxPopupControl" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxGridView.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxEditors.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dxe" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Gridview With Delete</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
         <dxe:ASPxLabel ID="lblMessage" runat="server" Text="" ForeColor="Red" Font-Bold="true" Visible="false" />
         <dxe:ASPxButton ID="btnDelete" runat="server" Text="Delete" onclick="btnDelete_Click">
         </dxe:ASPxButton>         
         <dx:ASPxGridView ID="devg" runat="server" ClientInstanceName="devg" 
         KeyFieldName="intGLCode" AutoGenerateColumns="False" 
             Width="554px" onafterperformcallback="devg_AfterPerformCallback" 
             onrowinserting="devg_RowInserting" onrowupdating="devg_RowUpdating">
            <Columns>
                <dx:GridViewCommandColumn Caption="New" VisibleIndex="1">
                    <NewButton Visible="true" />                    
                    <EditButton Visible="true" />
                </dx:GridViewCommandColumn>
                <dx:GridViewCommandColumn Caption="Delete" ShowSelectCheckbox="True" VisibleIndex="0">                
                <HeaderTemplate>  
                    <%--To select/unselect all rows in gridview--%>                   
                    Delete<input type="checkbox" id="CheckBoxControl" name="SelectAllCheckbox" 
                    onclick="devg.SelectAllRowsOnPage(this.checked);" runat="server" />
                </HeaderTemplate>                                                    
                </dx:GridViewCommandColumn>                                                              
                
                <dx:GridViewDataTextColumn Caption="ID" FieldName="ID" Name="ID" Visible="false">
                </dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn Caption="Name" FieldName="varName" Name="varName" Settings-AllowSort="False" VisibleIndex="2">                    
                </dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn Caption="Contact No" FieldName="varContactNo" Name="varContactNo" Settings-AllowSort="False" VisibleIndex="3">                    
                </dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn Caption="Email" FieldName="varEmail" Name="varEmail" VisibleIndex="4">
                </dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn Caption="Address" FieldName="varAddress" Name="varAddress" VisibleIndex="5">
                </dx:GridViewDataTextColumn>
            </Columns>
            <Settings ShowStatusBar="Visible" />
            <SettingsEditing Mode="PopupEditForm" />
        </dx:ASPxGridView>
        <dx:ASPxPopupControl ID="popupSample" runat="server" ShowCloseButton="true" ShowHeader="true" 
        PopupHorizontalAlign="WindowCenter" PopupVerticalAlign="WindowCenter">
        </dx:ASPxPopupControl>
    </div>
    </form>
</body>
</html>


Code behind page

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Text;
using DevExpress.Web.Data;
using DevExpress.Web.ASPxGridView;


public partial class GridviewWithDelete : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {


    }


    protected void Page_Init(object sender, EventArgs e)
    {
        BindGrid();
    }


    private void BindGrid()
    {
        SqlConnection conn = new SqlConnection("Connection string here");
        try
        {
            conn.Open();
            SqlCommand cmd;


            cmd = new SqlCommand("select ID,varName,varContactNo,varEmail,varAddress from ContactDetails");
            cmd.Connection = conn;
            DataSet dsClaimCat = new DataSet();
            
            SqlDataAdapter dapt = new SqlDataAdapter(cmd);
            dapt.Fill(dsClaimCat);
            devg.DataSource = dsClaimCat;
            devg.DataBind();
            conn.Close();
        }
        catch
        {
            Response.Write("Error");
        }
    }
    protected void btnDelete_Click(object sender, EventArgs e)
    {
        string strMultiIds;
        List<object> selectedRowList;


        strMultiIds = string.Empty;
        selectedRowList = (devg.GetSelectedFieldValues(new string[] { "ID" }));
        if (selectedRowList.Count == 0)
        {
            System.Windows.Forms.MessageBox.Show("Please Select Atleast one Record to Delete");
            return;
        }


        for (int i = 0; i < selectedRowList.Count; i++)
        { strMultiIds += selectedRowList[i].ToString() + ","; }


        strMultiIds.TrimEnd(',');
        try
        {
            delete(strMultiIds.TrimEnd(','));
        }
        catch(Exception ex)
        {
            lblMessage.Visible = true;
            lblMessage.Text = ex.Message;
        }
        BindGrid();
    }


    private void delete(string p)
    {
        if (p.Equals(""))
            return;
        try
        {
            deleteRows(p, "ContactDetails");
        }
        catch(Exception ex)
        {
            lblMessage.Visible = true;
            lblMessage.Text = ex.Message;
        }
    }


    private void deleteRows(string selectedid, string tablename)
    {
        StringBuilder sqlQuery = new StringBuilder();
        selectedid = selectedid.TrimEnd(',') + ",0";
        StringBuilder whereClause = new StringBuilder();
        whereClause.Append(" WHERE ID IN (" + selectedid + ") ");
        sqlQuery.Append(" DELETE FROM ");
        sqlQuery.Append(tablename + whereClause.ToString());
        try
        {
            SqlConnection conn = new SqlConnection("Connection string here");
            conn.Open();
            SqlCommand cmd;


            cmd = new SqlCommand(sqlQuery.ToString());
            cmd.Connection = conn;
            DataSet dsClaimCat = new DataSet();


            SqlDataAdapter dapt = new SqlDataAdapter(cmd);
            dapt.Fill(dsClaimCat);
            devg.DataSource = dsClaimCat;
            devg.DataBind();
            conn.Close();
            lblMessage.Visible = true;
            lblMessage.Text = "Record(s) Deleted";
        }
        catch (Exception ex)
        {
            lblMessage.Visible = true;
            lblMessage.Text = ex.Message;
        }
    }
    protected void devg_AfterPerformCallback(object sender, ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        BindGrid();
    }
    protected void devg_RowUpdating(object sender, ASPxDataUpdatingEventArgs e)
    {
        StringBuilder sqlQuery = new StringBuilder();
        SqlConnection conn = new SqlConnection("Connection string here");
        sqlQuery.Append("UPDATE ContactDetails SET ");
        sqlQuery.Append("varName = '" + e.NewValues["varName"].ToString() + "',");
        sqlQuery.Append("varContactNo = '" + e.NewValues["varContactNo"].ToString() + "',");
        sqlQuery.Append("varEmail = '" + e.NewValues["varEmail"].ToString() + "',");
        sqlQuery.Append("varAddress = '" + e.NewValues["varAddress"].ToString() + "'");
        sqlQuery.Append(" WHERE ID= "+ e.Keys["ID"]+"");
        conn.Open();
        SqlCommand cmd;


        cmd = new SqlCommand(sqlQuery.ToString());
        cmd.Connection = conn;
        DataSet dsClaimCat = new DataSet();


        SqlDataAdapter dapt = new SqlDataAdapter(cmd);
        int i = cmd.ExecuteNonQuery();
        if (i > 0)
        {            
            e.Cancel = true;
            devg.CancelEdit();
        }
        lblMessage.Visible = true;
        lblMessage.Text = "Record(s) Updated";
        BindGrid();
        conn.Close();
    }
    protected void devg_RowInserting(object sender, ASPxDataInsertingEventArgs e)
    {
        StringBuilder sqlQuery = new StringBuilder();
        SqlConnection conn = new SqlConnection("connection string here");
        sqlQuery.Append("INSERT INTO ContactDetails(varName,varContactNo,varEmail,varAddress) VALUES ( ");
        sqlQuery.Append("'" + e.NewValues["varName"].ToString() + "',");
        sqlQuery.Append("'" + e.NewValues["varContactNo"].ToString() + "',");
        sqlQuery.Append("'" + e.NewValues["varEmail"].ToString() + "',");
        sqlQuery.Append("'" + e.NewValues["varAddress"].ToString() + "')");
        conn.Open();
        SqlCommand cmd;


        cmd = new SqlCommand(sqlQuery.ToString());
        cmd.Connection = conn;
        DataSet dsClaimCat = new DataSet();


        SqlDataAdapter dapt = new SqlDataAdapter(cmd);
        int i = cmd.ExecuteNonQuery();
        if (i > 0)
        {            
            e.Cancel = true;
            devg.CancelEdit();
        }
        lblMessage.Visible = true;
        lblMessage.Text = "Record(s) Saved";
        BindGrid();
        conn.Close();
    }
   
}

May 4, 2010

Create Devexpress Bar chart - Webchartcontrol - Xtracharts

This code shows how its easy to use a Bar chart in your Web applications.

To start with first of all download and install Devexpress controls from www.devexpress.com

Here I am going to make a bar chart with the use of WebchartControl (Xtracharts)

Note : I have used version 9.2.3

Code .cs Page

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using DevExpress.XtraCharts;
using System.Drawing;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        BindChart();
    }


    private void BindChart()
    {
        SqlConnection conn = new SqlConnection("Connection string here");
        try
        {
            conn.Open();
            SqlCommand cmd;          
            cmd = new SqlCommand("select * from Transactions"); // my sample query
            cmd.Connection = conn;
            DataSet dsClaimCat = new DataSet();


            SqlDataAdapter dapt = new SqlDataAdapter(cmd);
            dapt.Fill(dsClaimCat);
            WebChartControl1.DataSource = dsClaimCat.Tables[0];
             //Values for X-axis
            WebChartControl1.SeriesDataMember = dsClaimCat.Tables[0].Columns["percentage"].ToString();
             //Values for Y-axis
            WebChartControl1.SeriesTemplate.ArgumentDataMember = dsClaimCat.Tables[0].Columns["paymentDays"].ToString();
            WebChartControl1.SeriesTemplate.ValueDataMembers.AddRange(new string[] { dsClaimCat.Tables[0].Columns["percentage"].ToString() });
            string paletteName = "MyPalette";
            PaletteEntry entry1 = new PaletteEntry(Color.Green, Color.LightGreen);
            Palette palette = new Palette(paletteName, new PaletteEntry[] { entry1 });
            WebChartControl1.PaletteRepository.Add(paletteName, palette);
            WebChartControl1.PaletteName = paletteName;
            SideBySideBarSeriesView v = new SideBySideBarSeriesView();
            v.BarWidth = 0.4;
          
            WebChartControl1.SeriesTemplate.View = v;
            WebChartControl1.DataBind();


            conn.Close();
        }
        catch
        {
            Response.Write("Error");
        }
    }
}

Design Page



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="DevExpress.XtraCharts.v9.2.Web, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.XtraCharts.Web" TagPrefix="dxchartsui" %>
<%@ Register Assembly="DevExpress.XtraCharts.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.XtraCharts.Web" TagPrefix="cci" %>
<%@ Register Assembly="DevExpress.XtraCharts.v9.2, Version=9.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.XtraCharts" TagPrefix="cc1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>      
        <dxchartsui:WebChartControl ID="WebChartControl1" runat="server" Height="200px" Width="300px"
            PaletteName="The Trees">                    
                <SeriesTemplate LabelTypeName="SideBySideBarSeriesLabel" PointOptionsTypeName="PointOptions"
                SeriesViewTypeName="SideBySideBarSeriesView">
              
                <View HiddenSerializableString="to be serialized">
                </View>
                <Label HiddenSerializableString="to be serialized" LineVisible="True">
                    <FillStyle FillOptionsTypeName="SolidFillOptions">
                        <Options HiddenSerializableString="to be serialized"></Options>
                    </FillStyle>
                </Label>            
                <PointOptions HiddenSerializableString="to be serialized">
                </PointOptions>
                <LegendPointOptions HiddenSerializableString="to be serialized">
                </LegendPointOptions>
            </SeriesTemplate>
            <FillStyle FillOptionsTypeName="SolidFillOptions">
                <Options HiddenSerializableString="to be serialized"></Options>
            </FillStyle>
        </dxchartsui:WebChartControl>
    </div>
    </form>
</body>
</html>