Saturday, June 11, 2005
memassingkan paramater dari stored procedure
Protected Sub Btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn1.Click
Dim sConnStr As String = {MyConnectionString}
Dim cnBKTest As New SqlConnection(sConnStr)
Dim cmdTest As New SqlCommand("Insert_Test", cnBKTest)
cmdTest.CommandType = Data.CommandType.StoredProcedure
cmdTest.Parameters.Add(New SqlParameter("@TestParam", Data.SqlDbType.VarChar, 10))
cmdTest.Parameters("@TestParam").Value = "Testing"
cnBKTest.Open() cmdTest.ExecuteNonQuery() cnBKTest.Close()
End Sub
Friday, June 10, 2005
memassingkan paramater dari stored procedure
Protected Sub Btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn1.Click
Dim sConnStr As String = {MyConnectionString}
Dim cnBKTest As New SqlConnection(sConnStr)
Dim cmdTest As New SqlCommand("Insert_Test", cnBKTest)
cmdTest.CommandType = Data.CommandType.StoredProcedure
cmdTest.Parameters.Add(New SqlParameter("@TestParam", Data.SqlDbType.VarChar, 10))
cmdTest.Parameters("@TestParam").Value = "Testing"
cnBKTest.Open() cmdTest.ExecuteNonQuery() cnBKTest.Close()
End Sub
Pengetahuan SQL !!!
SQL Dibagi menjadi 8 subsets:
1. DML – Data Manipulation Language dimana untuk insert, delete and update (table items).
2. DDL – Data definition language dimana untuk mencari create, delete and update statements untuk tabel dan views.
3. Triggers dan Advanced Integrity Constraints untuk memebuat actions yang akan ditrigger ketika
database berubah.
4. Embedded dan Dynamic SQL mengijinkan kita untuk memanggil SQL code dari host language seperti C and COBOL.
5. Client-Server Execution dan Remote Database Access untuk dapat menggunakan commands yang mengontrol bagaimana sebuah client application program dapat connect ke SQL Server.
6. Transaction Management.
7. Keamanan untuk mengkontrol akses user ke data objects saeperti tables and views.
8. Advanced features seperti data mining
SQL Statement untuk membuat Products table:
CREATE TABLE quality ( quality_name CHAR(10) PRIMARY KEY (quality_name)
)
CREATE TABLE products ( prod_id INTEGER,
Prod_name CHAR(10), prod_quality CHAR(10) PRIMARY KEY (prod_id),
FOREIGN KEY (prod_quality) REFERENCES quantity
)
Kita telah punya tabel product lalu kita dapat insert records menggunakan statements dibawah ini:
SQL insert Statement:
INSERT INTO quality (quality_name) values (‘excellent’)
INSERT INTO quality (quality_name) values (‘good’)
INSERT INTO quality (quality_name) values (‘normal’)
INSERT INTO quality (quality_name) values (‘bad’)
INSERT INTO products (prod_id,prod_name,prod_quality) values (1,‘product A’,‘bad’)
Dalam kasus ini penginsertan data berhasil karena prod_quality value yang kita inginkan untuk di masukkan ada ditabel quality, tapi jika kita mencoba untuk memasukkan sebuah value yang tidak ada didalam tabel maka pesan eror akan mengembalikan nilai :
Violation of PRIMARY KEY constraint 'PK_products'. Cannot insert duplicate key in object 'products'.
Untuk menampilkan records yang telah kita masukkan kita butuh menggunakan select statement:
SELECT * FROM PRODUCTS
Atau
SELECT prod_id,prod_name,prod_quality FROM PRODUCTS
Jika ingin menampilkan sepesifik record :
SELECT * FROM PRODUCTS WHERE prod_quality=’bad’
Jika ingin mengupdate record :
UPDATE products SET prod_name=’Product B’ WHERE prod_id=1
Jika ingin mendelete record :
DELETE products
atau
DELETE products WHERE prod_id=1
The inner join statement digunakan untuk multiple query yang mempunyai hubungan record-record, ini satu contoh :
SELECT * FROM products INNER JOIN quality ON products.prod_quality=quality._quality_name
The nested statement is a statement that as another statement embedded within it, the embedded query is also called as subquery.
SELECT prod_id,prod_name, (SELECT quality_name WHERE quality_name=products.prod_quality) AS prodquality FROM products
Kesimpulan :
SQL adalah bahasa yang sederhana yang mengijinkan kamu untuk operasi dengan tables, records dan database objects.
Kuliah Online
First Name ASC sort DESC
Last Name ASC sort DESC
<%
DIM strOrderBy, tmpOrderBy
strOrderBy = Request.QueryString("OB")
Select Case strOrderBy
Case "f_a"
tmpOrderBy = "ORDER BY FirstName ASC"
Case "fn_d"
tmpOrderBy = "ORDER BY FirstName DESC"
Case "l_a"
tmpOrderBy = "ORDER BY LastName ASC"
Case "l_d"
tmpOrderBy = "ORDER BY LastName DESC"
Case Else
tmpOrderBy = "ORDER BY FirstName DESC"
End Select
DIM mySQL, objRS
mySQL = "Select FirstName, LastName FROM tblUsers " & tmpOrderBy
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn
DO WHILE NOT objRS.EOF
%>
<%=objRS("FirstName")%> <%=objRS("LastName")%>
<%
objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Kuliah Online
<%
DIM mySQL, objRS
mySQL = "SELECT TOP 10 * FROM tblScripts ORDER BY DateEntered DESC"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn
%>
|
Our Latest Scripts |
| <%=objRS("Script")%> |
|
<% iRecordCount = iRecordCount + 1 objRS.MoveNext Loop objRS.Close Set objRS = Nothing objConn.Close Set objConn = Nothing %> |
Kuliah Online
<%
DIM mySQL, objRS
mySQL = "SELECT * FROM myTable"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn
' Count how many records exist
DIM iRecordCount
iRecordCount = 0
DO WHILE NOT objRS.EOF
iRecordCount = iRecordCount + 1
objRS.MoveNext
Loop
' Display result
Response.Write "(" & iRecordCount & ")"
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Dengan menggunakan SQL COUNT method:
<%
DIM mySQL, objRS
mySQL = "SELECT Count(*) AS intTotal FROM myTable"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open recSQL, objConn
' Display result
Response.Write objRS("intTotal")
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Kuliah Online
<%
DIM mySQL, objRS
mySQL = "SELECT * FROM tblData"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn, adOpenKeySet
| These are my database records. |
| <% objRS("Item") %> |
| <% objRS("Item") %> |
<%
END IF
iRecordCount = iRecordCount + 1
objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Kuliah Online
<%
DIM objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=myCONNECTION.dsn"
objConn.Open
%>
kita perlu mengisntal DSN di servernya
contoh dari penggunaan DSN-less connection:
<%
DIM objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
Server.MapPath ("/mydatabase.mdb") & ";"
objConn.Open
%>
Kuliah Online
isi dari formpage.asp adalah
isi dari resultspage.asp adalah
<%
DIM strEmail, strName, strComments, mail, reply, objMail
strEmail = request.form("Email")
strName = request.form("Name")
strComments = request.form("Comments")
mail = "YOUR EMAIL ADDRESS HERE"
reply = request.form("Email")
Set objMail = Server.CreateObject("CDONTS.NewMail")
objMail.From = reply
objMail.Subject = "YOUR SUBJECT MESSAGE HERE"
objMail.To = mail
objMail.Body = "Email: " & strEmail & vbCrLf & _
"Name: " & strName & vbCrLf & _
"Comments: " & vbCrLf & strComments
objMail.Send
Set objMail = nothing
%>
<%
strName = request.form("Name")
Response.Write strName
%>,
Thank you for emailing me.
isi dari body adalah
objMail.BodyFormat=0
objMail.MailFormat=0
Kuliah Online
employment.asp isisnya:
""
resultspage.asp isinya
<%
DIM objRSr, File, Upload, Count, Ext
DIM Mail, strMsgHeader
Set Upload = Server.CreateObject("Persits.Upload.1")
Count = Upload.SaveVirtual("/contactus/hr/upload/")
IF NOT Count=0 THEN
FOR EACH File IN Upload.Files
Ext = UCase(Right(File.Path, 3))
IF Ext <> "TXT" AND Ext <> "DOC" THEN
Response.Write Upload.Form("FirstName") & ",
"
Response.Write "Sorry, your resume " & File.Path & " is not in a .DOC or .TXT format and has not been delivered through our system. Please save your resume in one of these formats and resubmit it."
File.Delete
ELSE
Set objRSr = Server.CreateObject("ADODB.Recordset")
objRSr.Open "tblContact", objConn, , adLockOptimistic, adCmdTable
objRSr.AddNew
objRSr("Data") = "Resumes"
objRSr("Email") = Upload.Form("Email")
objRSr("FirstName") = Upload.Form("FirstName")
objRSr("LastName") = Upload.Form("LastName")
objRSr("Position") = Upload.Form("Position")
objRSr("Comments") = Upload.Form("Comments")
objRSr("DateSubmitted") = Date()
Set File = Upload.Files("fResume")
If Not File Is Nothing Then objRSr("fResume").Value = File.Binary
objRSr.Update
objRSr.Close
Set objRSr = Nothing
Set Mail = Server.CreateObject("Persits.MailSender")
Mail.Host = "mail.YOUR_DOMAIN_NAME_HERE.com"
Mail.From = Upload.Form("Email")
Mail.AddAddress "YOUR_EMAIL_ADDRESS_HERE"
Mail.Subject = "Resume"
strMsgHeader = "This email was delivered from your website." & vbCrLf & vbCrLf
Mail.Body = strMsgHeader & "Email: " & Upload.Form("Email") & vbCrLf & "First Name: " & Upload.Form("FirstName") & vbCrLf & "Last Name: " & Upload.Form("LastName") & vbCrLf & "Position: " & Upload.Form("Position") & vbCrLf & vbCrLf & "Comments: " & Upload.Form("Comments")
IF Count > 0 THEN
Mail.AddAttachment Upload.Files(1).Path
On Error Resume Next
Mail.Send
IF Err <> 0 THEN
Response.Write "There was an error sending your message. Please visit our Contact Us page and send a message to our Webmaster to report this error: " & Err.Description & ""
ELSE
Response.Write Upload.Form("FirstName") & ","
Response.Write "
Thank you for contacting our recruiter. Your resume has been received and will be reviewed shortly. If we have a position is available that matches your skills, we will contact you to schedule an interview. We keep all resumes on file for a period of 6 months, please feel free to resubmit your resume after this time for future consideration.
"File.Delete
END IF
END IF
END IF
NEXT
%>
<%
' This is a nice way to Personalize your FORM.
' It disPlays the Persons name before your message.
strName = Request.Form("FirstName")
Response.Write strFirstName
%>,
Thank you for emailing us your resume.
Membuat Error Log File Sederhana menggunakan ASP.NET dan C#
using System.IO;
using System.Text;
private string sLogFormat;
private string sErrorTime;
public CreateLogFiles()
{
//sLogFormat used to create log files format :
// dd/mm/yyyy hh:mm:ss AM/PM ==> Log Message
sLogFormat = DateTime.Now.ToShortDateString().ToString()+" "+DateTime.Now.ToLongTimeString().ToString()+" ==> ";
//this variable used to create log filename format "
//for example filename : ErrorLogYYYYMMDD
string sYear = DateTime.Now.Year.ToString();
string sMonth = DateTime.Now.Month.ToString();
string sDay = DateTime.Now.Day.ToString();
sErrorTime = sYear+sMonth+sDay;
}
Ini adalah contoh deklarasi variabel yang digunakan:
private string sLogFormat;
private string sErrorTime;
public CreateLogFiles()
{
//sLogFormat used to create log files format :
// dd/mm/yyyy hh:mm:ss AM/PM ==> Log Message
sLogFormat = DateTime.Now.ToShortDateString().ToString()+" "+DateTime.Now.ToLongTimeString().ToString()+" ==> ";
//this variable used to create log filename format "
//for example filename : ErrorLogYYYYMMDD
string sYear = DateTime.Now.Year.ToString();
string sMonth = DateTime.Now.Month.ToString();
string sDay = DateTime.Now.Day.ToString();
sErrorTime = sYear+sMonth+sDay;
}
Ini adalah function yang menciptakan error file:
public void ErrorLog(string sPathName, string sErrMsg)
{
StreamWriter sw = new StreamWriter(sPathName+sErrorTime,true);
sw.WriteLine(sLogFormat + sErrMsg);
sw.Flush();
sw.Close();
}
Untuk menggunakan class ini, diciptakan sebuah contoh web form yang disebut: CreateLogFiles
Kita memanggil function Errorlog dari class kita ketika button search diklik.
private void BtnFind_Click(object sender, System.EventArgs e)
{
try
{
StreamReader sr = new StreamReader(this.TxtFilename.Text);
sr.Read();
sr.Close();
Msg.Visible = true;
Msg.Text = "File "+ this.TxtFilename.Text +" was found";
}
catch(Exception ex)
{
CreateLogFiles Err = new CreateLogFiles();
Err.ErrorLog(Server.MapPath("Logs/ErrorLog"),ex.Message);
Msg.Visible = true;
Msg.Text = "Fatal error : "+ ex.Message + ", please find a complete error at ErrorLog file";
}
}
Struktur Tree pada ASP.NET dan SQL Server
XML menangani hirarki dengan baik, tetapi bila kita memiliki database yang penuh dengan data, kita ingin mengasosiasikan dengan tree, misalkan tabel yang penuh dengan artikel, memecah data store antara XML dan SQL Server bukanlah pilihan yang tepat. Relational SQL tidak mempermudah penyimpanan dibandingkan dengan operasi yang efisien pada tree.
Representasi tree pada .NET
Setiap elemen pada tree adalah node, dan yang paling atas yang tidak memiliki parent adalah root. Kita membuat class sederhana untuk merepresentasikan setiap node pada tree
1.UniqueId
Data Type : int
Fungsi : identifier unik untuk node dalam tree
2.ParentID
Data Type : int
Fungsi : untuk mengidentifikasi node parent dari object ini
3. Name
Data Type : string
Fungsi : Teks value, tidak harus unik, akan diasosiasikan dengan node ini
4. Children
Data Type : ArrayList<TreeNode>
Fungsi : collection dari object-object TreeNode
Contoh class yang digunakan
[Serializable]
public class TreeNode
{
private int _uniqueID;
private string _name;
private int _parentID;
private int _depth;
private ArrayList _children;
public TreeNode() { }
public TreeNode(string name, int parentID) : this(0,name,parentID,-1)
{
}
public TreeNode(int uniqueID, string name, int parentID, int depth)
{
_uniqueID = uniqueID;
_name = name;
_parentID = parentID;
_depth = depth;
}
/// <summary>
/// Mengambil atau menentukan ID unik yang berhubungan dengan kategori ini
/// </summary>
/// <remarks>jika non-zero ID sudah di set maka tidak boleh diganti.</remarks>
public int UniqueID
{
get { return _uniqueID; }
set
{
if (_uniqueID == 0)
_uniqueID = value;
else
throw new Exception("The UniqueID property cannot be modified once it has a non-zero value");
}
}
public int Depth
{
get { return _depth; }
}
/// <summary>
/// Mengambil atau menentukan label untuk node ini
/// </summary>
public string Name
{
get { return _name; }
set { _name = value; }
}
/// <summary>
/// ID dari node Parent
/// </summary>
public int ParentID
{
get { return _parentID; }
set { _parentID = value; }
}
/// <summary>
/// Gets the children TreeNode objects for this category
/// </summary>
/// <remarks>Pada .NET 2.0, ini dapat dimodifikasi sehingga menggunakan generics, and dengan tipe ArrayList<TreeNode></remarks>
public ArrayList Children
{
get { return _children; }
set { _children = value; }
}
}
Menambahkan sebuah kalender poppup pada datagrid ASP.NET
Pada program yang akan ditunjuklan terlihat bahwa kita akan menggunakan templatecolums dan pada edititemtemplate yang terdapat pada templatecolumn untuk field orderdate telah ditambahkan sebuah linkbutton untuk menunjukkan sebuah gambar kalender kecil ketika berada pada mode edit.
Hanya itu yang perlu kita lakukan pada halaman aspx kita untuk membuat datagrid kita siap untuk kalender popup. Program sebenarnya untuk mengimplementasikan
kalender popup berada pada file codebehind.
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="DGPopupCal.aspx.vb" Inherits="DotNetJohn.DGPopupCal"% >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html >
<head >
<title > DGPopupCal</title >
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1" >
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1" >
<meta name=vs_defaultClientScript content="JavaScript" >
<meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5" >
</head >
<body MS_POSITIONING="GridLayout" >
<form id="Form1" method="post" runat="server" >
<asp:datagrid id="dtgOrders"
runat="server"
BorderStyle="Ridge"
BorderColor="LightGray"
BorderWidth="1px"
DataKeyField="OrderID"
AutoGenerateColumns="False"
HeaderStyle-Wrap="false"
HeaderStyle-Font-Bold="True"
HeaderStyle-BackColor="LightGrey"
AlternatingItemStyle-BackColor="LightGrey"
CellPadding="2"
GridLines="Horizontal"
Width="500px" >
<EditItemStyle BackColor="Coral" > </EditItemStyle >
<HeaderStyle Font-Bold="True" Wrap="False" BackColor="LightGray" > </HeaderStyle >
<Columns >
<asp:TemplateColumn HeaderText="Customer ID" >
<ItemStyle HorizontalAlign="Left" > </ItemStyle >
<ItemTemplate >
<asp:Label id="lblCustomerID" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CustomerID", "") % > ' >
</asp:Label >
</ItemTemplate >
<EditItemTemplate >
<asp:TextBox id="tbCustomerID" runat="server" Width="65px" Text='<%# DataBinder.Eval(Container, "DataItem.CustomerID", "") % > ' >
</asp:TextBox >
</EditItemTemplate >
</asp:TemplateColumn >
<asp:TemplateColumn HeaderText="Employee ID" >
<ItemStyle HorizontalAlign="Left" > </ItemStyle >
<ItemTemplate >
<asp:Label id="lblEmployeeID" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.EmployeeID", "") % > ' >
</asp:Label >
</ItemTemplate >
<EditItemTemplate >
<asp:TextBox id="txtEmployeeID" runat="server" Width="65px" Text='<%# DataBinder.Eval(Container, "DataItem.EmployeeID", "") % > ' >
</asp:TextBox >
</EditItemTemplate >
</asp:TemplateColumn >
<asp:TemplateColumn HeaderText="Order Date" >
<ItemTemplate >
<asp:Label id="lblOrderDate" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.OrderDate", "{0:d}") % > ' >
</asp:Label >
</ItemTemplate >
<EditItemTemplate >
<asp:TextBox id="txtOrderDate" runat="server" Width="75px" Text='<%# DataBinder.Eval(Container, "DataItem.OrderDate", "{0:d}") % > ' ReadOnly="True" >
</asp:TextBox >
<asp:HyperLink id="lbtnCalendar" runat="server" ImageUrl="images/smallcalendar.gif" > </asp:HyperLink >
</EditItemTemplate >
</asp:TemplateColumn >
<asp:TemplateColumn >
<ItemTemplate >
<asp:LinkButton id="lbtnEdit" runat="server" Text="<img border=0 src=images/dtg_edit.gif alt=edit > " CommandName="Edit" > </asp:LinkButton >
</ItemTemplate >
<EditItemTemplate >
<asp:LinkButton id="lbtnUpdate" runat="server" Text="<img border=0 src=images/dtg_update.gif alt=save/update > " CommandName="Update" > </asp:LinkButton >
<asp:LinkButton id="lbtnCancel" runat="server" Text="<img border=0 src=images/dtg_cancel.gif alt=cancel > " CommandName="Cancel" > </asp:LinkButton >
</EditItemTemplate >
</asp:TemplateColumn >
</Columns >
</asp:datagrid > </P >
</form >
</body >
</html >
File codebehind ditunjukkan pada bagian setelah ini.
Yang harus diperhatikan adalah event itemdatabound (subrutin terakhir pada program). Pada event ini terdapat pemanggilan terhadap kalender yang terdapat pada DGCal.aspx dengan
menggunakan java script
Imports System.Data.SqlClient
Imports System.Configuration
Public Class DGPopupCal
Inherits System.Web.UI.Page
Protected WithEvents dtgOrders As System.Web.UI.WebControls.DataGrid
Dim dataSet As dataSet
' " Web Form Designer Generated Code " Omitted
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
GetData()
End If
End Sub
Private Sub GetData()
Dim objConn As New SqlConnection(ConfigurationSettings.AppSettings("NorthwindConnection"))
Dim objCmd As New SqlCommand
Dim dataAdapter As SqlDataAdapter
objCmd.Connection = objConn
objCmd.CommandType = CommandType.Text
objCmd.CommandText = "SELECT Top 10 OrderID, CustomerID, EmployeeID, OrderDate FROM Orders"
objConn.Open()
dataAdapter = New SqlDataAdapter
dataAdapter.TableMappings.Add("Table", "Orders")
dataAdapter.SelectCommand = objCmd
dataSet = New DataSet("Orders")
dataAdapter.Fill(dataSet)
dtgOrders.DataSource = dataSet
dtgOrders.DataBind()
objConn.Dispose()
End Sub
Sub dtgOrders_Edit(ByVal sender As Object, ByVal e As DataGridCommandEventArgs) Handles dtgOrders.EditCommand
dtgOrders.EditItemIndex = CInt(e.Item.ItemIndex)
GetData()
End Sub
Sub dtgOrders_Cancel(ByVal sender As Object, ByVal e As DataGridCommandEventArgs) Handles dtgOrders.CancelCommand
dtgOrders.EditItemIndex = -1
GetData()
End Sub
Sub dtgOrders_Update(ByVal sender As Object, ByVal e As DataGridCommandEventArgs) Handles dtgOrders.UpdateCommand
Dim OrderID As Int32
Dim CustomerID As String
Dim EmployeeID As Int32
Dim OrderDate As String
OrderID = Convert.ToInt32(dtgOrders.DataKeys(CInt(e.Item.ItemIndex)))
CustomerID = Convert.ToString(CType(e.Item.FindControl("tbCustomerID"), TextBox).Text)
OrderDate = Convert.ToString(CType(e.Item.FindControl("txtOrderDate"), TextBox).Text)
EmployeeID = Convert.ToInt32(CType(e.Item.FindControl("txtEmployeeID"), TextBox).Text)
Dim strSQL As String
strSQL = "UPDATE Orders SET " _
& "CustomerID='" & CustomerID & "', " _
& "EmployeeID=" & EmployeeID & ", " _
& "OrderDate='" & OrderDate & "' " _
& "WHERE OrderID=" & OrderID
'Dim objConn As New SqlConnection(ConfigurationSettings.AppSettings("NorthwindConnection"))
'Dim objCmd As New SqlCommand
'objCmd.Connection = objConn
'objCmd.CommandType = CommandType.Text
'objCmd.CommandText = strSQL
'objConn.Open()
'objCmd.ExecuteNonQuery()
'objConn.Dispose()
dtgOrders.EditItemIndex = -1
GetData()
End Sub
Private Sub dtgOrders_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dtgOrders.ItemDataBound
If e.Item.ItemType = ListItemType.EditItem Then
Dim strTextBoxName As String = e.Item.Cells(0).FindControl("txtOrderDate").ClientID()
CType(e.Item.FindControl("lbtnCalendar"), HyperLink).NavigateUrl = "javascript:calendar_window=window.open('DGCal.aspx?formname=Form1." & strTextBoxName & "','DatePicker','width=250,height=190,left=360,top=180');calendar_window.focus();"
End If
End Sub
End Class
Berikut adalah isi dari file DGCal.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="DGCal.aspx.vb" Inherits="DotNetJohn.DGCal" % >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML >
<HEAD >
<title > DGCal</title >
<META http-equiv="Content-Type" content="text/html; charset=Windows-1252" >
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0" >
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0" >
<meta name="vs_defaultClientScript" content="JavaScript" >
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5" >
<LINK href="styles.css" type="text/css" rel="stylesheet" >
</HEAD >
<body MS_POSITIONING="FlowLayout" bottomMargin="2" leftMargin="2" topMargin="2" rightMargin="2" >
<form id="Form1" method="post" runat="server" >
<asp:Calendar id="Calendar1"
runat="server"
OnSelectionChanged="Calendar1_SelectionChanged" >
<TodayDayStyle BorderWidth="1px" BorderStyle="Solid" BackColor="Linen" > </TodayDayStyle >
<NextPrevStyle ForeColor="White" BackColor="Navy" > </NextPrevStyle >
<TitleStyle ForeColor="White" BackColor="Navy" > </TitleStyle >
<OtherMonthDayStyle ForeColor="Silver" > </OtherMonthDayStyle >
</asp:Calendar > <BR >
<asp:Literal id="Literal1" runat="server" > </asp:Literal >
</form >
</body >
</HTML >
Loading ASP.NET Template secara Dinamik(contoh:memformat data-bound control)
Listing 1. The DB class
public class DB
{
public DB()
{
}
/// <summary>
/// Method mengembalikan objek DataSet yang diisi dengan data
/// </summary>
public static DataSet GetDataSet()
{
// Buat sebuah DataSet dan sebuah DataTable
DataSet ds = new DataSet();
DataTable table = new DataTable("Records");
DataColumn col;
// Buat & Tambahkan DataTable columns
col = new DataColumn();
col.DataType = System.Type.GetType("System.Int32");
col.ColumnName = "ID";
col.ReadOnly = true;
col.Unique = true;
table.Columns.Add(col);
col = new DataColumn();
col.DataType = System.Type.GetType("System.String");
col.ColumnName = "Name";
col.AutoIncrement = false;
col.Caption = "Name";
col.ReadOnly = false;
col.Unique = false;
table.Columns.Add(col);
col = new DataColumn();
col.DataType = System.Type.GetType("System.String");
col.ColumnName = "Address";
col.AutoIncrement = false;
col.Caption = "Address";
col.ReadOnly = false;
col.Unique = false;
table.Columns.Add(col);
// Buat & Tambah DataTable rows
DataRow row = table.NewRow();
row["ID"] = 1001;
row["Name"] = "Melanie Giard";
row["Address"] = "23rd Street, Park Road, NY City, NY";
table.Rows.Add(row);
row = table.NewRow();
row["ID"] = 1002;
row["Name"] = "Puneet Nehra";
row["Address"] = "3rd Blvd, Ashok Vihar, New Delhi";
table.Rows.Add(row);
row = table.NewRow();
row["ID"] = 1003;
row["Name"] = "Raj Mehta";
row["Address"] = "Nagrath Chowk, Jabalpur";
table.Rows.Add(row);
row = table.NewRow();
row["ID"] = 1004;
row["Name"] = "Max Muller";
row["Address"] = "25 North Street, Hernigton, Russia";
table.Rows.Add(row);
// Tambahkan DataTable pada DataSet
ds.Tables.Add(table);
// Return DataSet
return ds;
}
}
Listing 2. Item template secara tipikal
<%@ Language = "VB" %>
<FONT face="verdana" color="red" size="2"><b>ID: </b>
<%# DataBinder.Eval(CType(Container, DataListItem).DataItem, "ID") %>
<b>Name: </b>
<%# DataBinder.Eval(CType(Container, DataListItem).DataItem, "Name") %>
<br>
<b>Address: </b>
<%# DataBinder.Eval(CType(Container, DataListItem).DataItem, "Address") %>
<p>
</FONT>
Listing 3. The BindDataGrid method
// method ini bind sebuah DataSet menjadi DataGrid
private void BindDataGrid()
{
// DB.GetDataSet mengembalikan sebuah DataSet dengan sebuah tabel
// disebut 'Records' dengan tiga kolom - ID, Name and Address
dtSet = DB.GetDataSet();
DataList1.DataSource = dtSet.Tables[0].DefaultView;
DataList1.DataBind();
}
Kita memanggil method ini pada event page load seperti berikut:
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindDataGrid();
}
}
Pada langkah terakhir artikel ini, kita tambahkan code pada 2 event handler button click. Pada kedua button ini kita akan menampilkan 2 template yang berbeda. Secagai contoh pada code ini, property DataList AlternatingItemTemplate, ItemTemplate, HeaderTemplate, and FooterTemplate di-set dengan menggunakan method Page.LoadTemplate
private void Button1_Click(object sender, System.EventArgs e)
{
// Load template
DataList1.AlternatingItemTemplate = Page.LoadTemplate("AltItemTempate.ascx");
DataList1.ItemTemplate =Page.LoadTemplate("ItemTemplate.ascx");
DataList1.HeaderTemplate =Page.LoadTemplate("HeadTemplate.ascx");
DataList1.FooterTemplate = Page.LoadTemplate("FootTemplate.ascx");
BindDataGrid();
}
private void Button2_Click(object sender, System.EventArgs e)
{
// Load template
DataList1.AlternatingItemTemplate =
Page.LoadTemplate("AltItemTempate2.ascx");
DataList1.ItemTemplate = Page.LoadTemplate("ItemTemplate2.ascx");
DataList1.HeaderTemplate = Page.LoadTemplate("HeadTemplate2.ascx");
DataList1.FooterTemplate = Page.LoadTemplate("FootTemplate2.ascx");
BindDataGrid();
}
Highlight Rows dalam ASP.NET DataGrid
Kode untuk membuatnya terbagi atas dua, halaman aspx untuk mendefinisikan datagrid beserta atributnya. Sedangkan .vb untuk mengimplementasikan aktivitas database dan menangani metode ItemDataBound.
Halaman .aspx
< %@ Page Language="vb" Src="HighlightDataGrid.aspx.vb" Inherits="HighlightDataGrid" % >
< html >
< head >
< title >Mouseover Highlighting of DataGrid Rows< /title >
< /head >
< body >
< form runat="server" ID="Form1" >
< asp:DataGrid id="dtgCustomers"
runat="server"
OnItemDataBound="dtgCustomers_ItemDataBound"
CellPadding="4"
BackColor="White"
BorderWidth="1px"
BorderStyle="None"
BorderColor="Indigo"
AllowPaging="True"
PageSize="10"
OnPageIndexChanged="dtgCustomers_PageIndexChanged"
PagerStyle-Mode="NumericPages"
EnableViewState="False"
AutoGenerateColumns="True" >
< SelectedItemStyle font-bold="True"
forecolor="#663399"
backcolor="#FFCC66" >
< /SelectedItemStyle >
< ItemStyle forecolor="Navy"
backcolor="White" >
< /ItemStyle >
< AlternatingItemStyle ForeColor="Navy"
BackColor="Yellow" >
< /AlternatingItemStyle >
< HeaderStyle font-bold="True"
forecolor="Navy"
backcolor="LightYellow" >
< /HeaderStyle >
< PagerStyle horizontalalign="Center"
forecolor="Navy"
backcolor="LightYellow" >
< /PagerStyle >
< /asp:DataGrid >
< /form >
< /body >
< /html >
Berikutnya adalah file .vb nya
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data.SqlClient
Imports System.Data
Public Class HighlightDataGrid : Inherits Page
Protected dtgCustomers As DataGrid
Sub Page_Load(Sender As Object, E As System.EventArgs)
BindTheGrid()
End Sub
Sub BindTheGrid()
Dim sqlConn As New SqlConnection( _
"server=localhost;database=NorthWind;uid=sa;pwd=secret")
Dim dtaCustomers As New SqlDataAdapter( _
"Select CustomerID, CompanyName, ContactName, Phone " _
& "From Customers", sqlConn)
Dim dsCustomers As DataSet
Try
dsCustomers = New DataSet()
dtaCustomers.Fill(dsCustomers)
dtgCustomers.DataSource = dsCustomers
dtgCustomers.DataBind()
Catch SQLEx As SqlException
Response.Write(SQLEx.Message.ToString())
Catch Ex As Exception
Response.Write(Ex.Message.ToString())
Finally
sqlConn.Close()
End Try
End Sub
Kode berikutnya adalah yang secara langsung mengatur highlighting
Sub dtgCustomers_ItemDataBound(sender As Object, e As DataGridItemEventArgs)
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType =
ListItemType.AlternatingItem Then
e.Item.Attributes.Add("onmouseover", "this.style.backgroundColor='Silver'")
End If
If e.Item.ItemType = ListItemType.Item Then
e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor='White'")
Else
e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor='Yellow'")
End If
End Sub
Sub dtgCustomers_PageIndexChanged(sender As Object, e As DataGridPageChangedEventArgs)
dtgCustomers.CurrentPageIndex = e.NewPageIndex
BindTheGrid()
End Sub
End Class
Baris dalam blok if pertama menambakan atribut OnMouseOver pada Item dengan mengganti warna background apakan pada ItemTemplate atau AlternatingItemTemplate.
Blok If-Then-Else digunakan untuk melihat apakah ItemTemplate atau AlternatingItemTemplate dan menggunakan atribut OnMouseOut untuk mengganti warna background baris kembali ke setting awal
Bagaimana cara untuk membangun sistem rating yang membolehkan user untuk memberikan rating pada artikel onlinemu dan menampilkan rating secara grafik
<table width="0%" border="0" class="basic11pt">
<tr>
<td colspan="4">Rating:
<asp:image ID="imgRatingApproval" runat="server"></asp:image>
<asp:image ID="imgRatingBlank" runat="server"></asp:image>
<asp:label ID="lblRatingCount" runat="server"></asp:label>
</td>
</tr>
<tr>
<td>poor</td>
<td><asp:radiobuttonlist RepeatLayout="Flow"
RepeatDirection="Horizontal"
ID="rblRating"
runat="server">
<asp:listitem Value="1">1</asp:listitem>
<asp:listitem Value="2">2</asp:listitem>
<asp:listitem Value="3" selected="True">3</asp:listitem>
<asp:listitem Value="4">4</asp:listitem>
<asp:listitem Value="5">5</asp:listitem>
</asp:radiobuttonlist></td>
<td> great</td>
<td> <asp:button ID="btnRating"
OnClick="btnRating_Click"
runat="server"
Text="Rate It!" /></td>
</tr>
<tr>
<td colspan="4"><asp:label ID="lblRating" runat="server"></asp:label> </td>
</tr>
</table>
Pada event Page_Load definisikan variabelmu dan implementasikan data logic-mu sebagai berikut:
<script runat="server">
Private intPageID As Long = [your article ID here]
Sub Page_Load(Src As Object, E As EventArgs)
Dim intApprovalWidth, intBlankWidth as Integer
Dim strQuery as string
Dim strCon As String
Dim conMyConnection as New System.Data.SqlClient.sqlConnection()
Dim cmdMyCommand as New System.Data.SqlClient.SqlCommand()
Dim dtrMyDataReader as System.Data.SqlClient.sqlDataReader
If Not IsPostback Then
strCon = System.Configuration.ConfigurationSettings.AppSettings("MyConnectionString")
conMyConnection.ConnectionString = strCon
strQuery = "SELECT SUM(rating) As RatingSum, COUNT(*) As RatingCount "
strQuery += "FROM tblMyRatings WHERE Itemid=" & intArticleID
conMyConnection.Open()
cmdMyCommand.Connection = conSb
cmdMyCommand.CommandType = System.Data.CommandType.Text
cmdMyCommand.CommandText = strQuery
dtrMyDataReader = cmdMyCommand.ExecuteReader()
dtrMyDataReader.Read()
[code for building rating display goes here]
dtrMyDataReader.Close()
conMyConnection.Close()
End If
End Sub
</script>
Pada event on_click button rating code-nya sebagai berikut:
Sub btnRating_Click(Src As Object, E As EventArgs)
'Variable declarations...
Dim intApprovalWidth, intBlankWidth as Integer
Dim strSelectQuery, strInsertQuery as string
Dim strCon As String
Dim conMyConnection as New System.Data.SqlClient.sqlConnection()
Dim cmdMyCommand as New System.Data.SqlClient.SqlCommand()
Dim dtrMyDataReader as System.Data.SqlClient.sqlDataReader
Dim MyHttpAppObject As System.Web.HttpContext = System.Web.HttpContext.Current
Dim strRemoteAddress as String
Dim intSelectedRating, intCount As Integer
'Get the user's ip address and cast its type to string...
strRemoteAddress = Cstr(MyHttpApp.Request.UserHostAddress)
'Build the query string...
strSelectQuery = "SELECT COUNT(*) As RatingCount "
strSelectQuery += "FROM tbl_Rating WHERE Itemid=" & intArticleID "
strSelectQuery += " AND ip = '" & strRemoteAddress & "'"
'Open the connection, and execute the query...
strCon = System.Configuration.ConfigurationSettings.AppSettings("MyConnectionString")
conMyConnection.ConnectionString = strCon
conMyConnection.Open()
cmdMyCommand.Connection = conMyConnection
cmdMyCommand.CommandType = System.Data.CommandType.Text
cmdMyCommand.CommandText = strSelectQuery
intCount= cmdMyCommand.ExecuteScalar()
conMyConnection.Close()'Close the connection to release these resources...
If intCount = 0 Then 'The user hasn't rated the article before, so perform the insert...
strInsertQuery = "INSERT INTO tbl_rating (rating, ip, itemID) "
strInsertQuery += "VALUES ("
strInsertQuery += intSelectedRating & ", '"
strInsertQuery += strRemoteAddress & "', "
strInsertQuery += intArticleID & "); "
cmdMyCommand.CommandText = strInsertQuery
conMyConnection.Open()
cmdMyCommand.ExecuteNonQuery()
conMyConnection.Close()
Else 'The user has rated the article before, so display a message...
lblRating.Text = "You've already rated this article"
End If
strSelectQuery = "SELECT SUM(rating) As RatingSum, COUNT(*) As RatingCount "
strSelectQuery += "FROM tbl_Rating WHERE Itemid=" & intPageID
conMyConnection.Open()
cmdMyCommand.CommandText = strSelectQuery
dtrMyDataReader = cmdMyCommand.ExecuteReader()
dtrMyDataReader.Read()
lblRatingCount.Text = " / " & dtrKb("RatingCount")
intApprovalWidth = dtrKb("RatingSum")/dtrKb("RatingCount")*15
dtrMyDataReader.Close()
conMyConnection.Close()
intBlankWidth = 75 - intApprovalWidth
imgRatingApproval.Width = System.web.ui.webcontrols.unit.pixel(intApprovalWidth)
imgRatingBlank.Width = System.web.ui.webcontrols.unit.pixel(intBlankWidth)
End Sub
Enkripsi Cookies untuk mencegah pembobolan
Bekerja dengan HttpCookieEncryption
Secara dasar referensikan dll atau termasuk code pada projectmu. Tipe HttpCookieEncryption diturunkan dari
System.Web namespace, sehingga tidak ada extra "usings" atau "imports" yang tidak dipunyai secara default pada project ASP.NET.
Secara sederhana buat call ke HttpCookieEncryption.Encrypt untuk enkripsi cookie yang dispesifikasikan.
Catat overload yang kedua untuk enkripsi yang sebenarnya memodifikasi response.
Pada permintaan berikutnya, kamu dapat dekripsi cookie yang dienkripsi dengan memanggil HttpCookieEncryption.Decrypt(). Ini akan menerima cookie yang dispesifikasi dan mengembalikan instance baru dengan nilai dekripsi.
void Page_Load(object sender,EventArgs e)
{
HttpCookie myEncryptedCookie =
HttpCookieEncryption.Decrypt(this.Context,"myEncryptedCookie");
if(myEncryptedCookie==null)
{
//cookie tidak ada, mungkin permintaan pertama,
// ini secara normal sebuah login redirect atau sesuatu
HttpCookie test = Response.Cookies["myEncryptedCookie"];
//always returns an instance
test["key1"]="value1";
test["key2"]="value2";
HttpCookieEncryption.Encrypt(this.Context,"myEncryptedCookie");
//update Response, sehingga panggilan berikutnya untuk nilai cookie akan menghasilkan hex string yang dienkripsi
//sehingga jika kamu kehilangan referensi ke instance yang didekripsi, hanya panggil HttpCookieEncryption.Decrypt
HttpCookie decrypted = HttpCookieEncryption.Decrypt(this.Context,
"myEncryptedCookie");
//catat bahwa dekripsi tidak pernah update Response Cookie pada memory.
if(test["key1"].Equals(decrypted["key1"]) &&
test["key2"].Equals(decrypted["key2"]))
//symmetric algorithm magic
else
//should never happen.
}
}
Bagaimana kerjanya
Bagian paling penting adalah penggunaan ASP.NET yang dibuat pada property MachineKey untuk enkripsi cookie. Property ini digunakan untuk mengurutkan ViewState dan juga digunakan oleh FormsAuthentication.Encrypt untuk enkripsi FormsAuthenticationTicket
Reflection API digunakan untuk mendapatkan pointer untuk mengunci method yang digunakan secara internal oleh System.Web API. Class penolong, yang disebut MachineKeyWrapper diciptakan untuk menangani pekerjaan ini seperti yang tampak di bawah ini:
private static MethodInfo _encOrDecData;
private static MethodInfo _hexStringToByteArray;
private static MethodInfo _byteArrayToHexString;
static MachineKeyWrapper()
{
object config = HttpContext.Current.GetConfig("system.web/machineKey");
Type configType = config.GetType();
Type machineKeyType =
configType.Assembly.GetType("System.Web.Configuration.MachineKey");
if (machineKeyType == null)
{
machineKeyType =
configType.Assembly.GetType("System.Web.Configuration.MachineKeySection");
}
BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Static;
_encOrDecData = machineKeyType.GetMethod("EncryptOrDecryptData", bf);
_hexStringToByteArray = machineKeyType.GetMethod("HexStringToByteArray", bf);
_byteArrayToHexString = machineKeyType.GetMethod("ByteArrayToHexString", bf);
if( _encOrDecData==null ||
_hexStringToByteArray==null || _byteArrayToHexString==null )
{
throw new
InvalidOperationException("Unable to get the methods to invoke.");
}
}
The MachineKeyWrapper then mimics the internal System.Web.MachineKey class:
public static byte[] HexStringToByteArray(string str)
{
return (byte[]) _hexStringToByteArray.Invoke(null,
new object[] { str });
}
public static string ByteArrayToHexString(byte[] array, int length)
{
return (string) _byteArrayToHexString.Invoke(null,
new object[] { array, length });
}
public static byte[] EncryptOrDecryptData(bool encrypting,
byte[] data, byte[] mod, int index, int length)
{
return (byte[])_encOrDecData.Invoke(null,
new object[] { encrypting, data, mod, index, length });
}
Galeri Foto Dinamik pada ASP.NET and C#
Code-nya adalah sebagai berikut (disimpan menjadi showimages.aspx):
<%@ Page Language="c#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Xml" %>
<%@ Register TagPrefix="mbsp" Namespace="MetaBuilders.WebControls" Assembly="MetaBuilders.WebControls.ScrollingPanel" %>
<script runat="server">
DataSet m_dsPictures_Sections;
private void Page_Load(Object sender, EventArgs E) {
m_dsPictures_Sections=(DataSet)Cache["Picture_Cache"];
if(m_dsPictures_Sections==null)
{
m_dsPictures_Sections= new DataSet();
m_dsPictures_Sections.ReadXml(Server.MapPath("Pictures.xml"));
Cache.Insert("Picture_Cache",m_dsPictures_Sections,new CacheDependency(Server.MapPath("Pictures.xml")));
}
if (adminFeatures()==true) {adminPanel.Visible=true;}
GenerateFilmStrip();
}
public void GenerateFilmStrip()
{
string m_strTableName, m_strFileName, m_strEvent, m_strYear;
m_strTableName=Request.QueryString["event_images"].ToString();
m_strYear=m_strTableName.Substring(m_strTableName.Length-4, 4);
m_strEvent=m_strTableName.Substring(0, m_strTableName.LastIndexOf("-"));
for (int i=0; m_dsPictures_Sections.Tables[m_strTableName].Rows.Count-1>=i; i++)
{
m_strFileName=m_dsPictures_Sections.Tables[m_strTableName].Rows[i]["Filename"].ToString();
m_strFileName=(m_strFileName.Substring(0, m_strFileName.LastIndexOf('.')))+"_t"+
(m_strFileName.Substring(m_strFileName.LastIndexOf('.'),
(m_strFileName.Length-m_strFileName.LastIndexOf('.'))));
ImageButton m_cImage=new ImageButton();
m_cImage.ImageUrl="./Images/"+m_strYear+"/"+m_strEvent+"/"+m_strFileName;
m_cImage.Click+= new System.Web.UI.ImageClickEventHandler(Thumbnail_Click);
m_cPanel.Controls.Add(m_cImage);
}
}
protected void Thumbnail_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
string m_strRealFilename, strRef, m_strTableName, m_strCommentTmp, m_strCmt, m_strComments_Storage;
m_strTableName=m_strTableName=Request.QueryString["event_images"].ToString();
m_strRealFilename=((ImageButton)sender).ImageUrl;
m_strRealFilename=m_strRealFilename.Substring(0,m_strRealFilename.LastIndexOf('_'))+m_strRealFilename.Substring(m_strRealFilename.LastIndexOf('.'),m_strRealFilename.Length-m_strRealFilename.LastIndexOf('.'));
strRef=m_strRealFilename.Substring(m_strRealFilename.LastIndexOf("/"),m_strRealFilename.Length-m_strRealFilename.LastIndexOf("/"));
strRef=strRef.Substring(1,strRef.Length-1);
m_strAuthor.Text=strRef;
for (int i=0; m_dsPictures_Sections.Tables[m_strTableName].Rows.Count-1>=i; i++)
{
if (m_dsPictures_Sections.Tables[m_strTableName].Rows[i]["Filename"].ToString()==strRef)
{
m_strAuthor.Text=m_dsPictures_Sections.Tables[m_strTableName].Rows[i]["Author"].ToString();
}
else
{
if (sInfo.GetUserInfo("strName",Context.User.Identity.Name)==m_strAuthor.Text)
{
adminPanel.Visible=true;
}
break;
}
}
}
m_strMain_Image.ImageUrl=m_strRealFilename;
string tmpStr=((ImageButton)sender).ImageUrl;
tmpStr=tmpStr.Replace("_t.",".");
m_cAdminDel.CommandName=tmpStr.Substring(tmpStr.LastIndexOf("/")+1,tmpStr.Length-1-tmpStr.LastIndexOf("/"));
}
string GetXML(string sTag, string eTag, string Contents)
{
int nStart=Contents.IndexOf(sTag,0);
nStart+=(sTag.Length-1)+1;
int nEnd=Contents.IndexOf(eTag,nStart);
return Contents.Substring(nStart, nEnd-nStart);
}
protected bool adminFeatures()
{
if (ACCESS=="admin")
return true;
return false;
}
protected void adminDel(object sender, System.Web.UI.ImageClickEventArgs e)
{
string m_strTableName;
m_strTableName=m_strTableName=Request.QueryString["event_images"].ToString();
for (int i=0; m_dsPictures_Sections.Tables[m_strTableName].Rows.Count-1>=i; i++)
{
if (m_dsPictures_Sections.Tables[m_strTableName].Rows[i]["Filename"].ToString()==((ImageButton)sender).CommandName)
{
string fName=Server.MapPath(m_strMain_Image.ImageUrl);
System.IO.File.Delete(fName);
System.IO.File.Delete(fName.Replace(".", "_t."));
m_dsPictures_Sections.Tables[m_strTableName].Rows[i].Delete();
m_dsPictures_Sections.Tables[m_strTableName].AcceptChanges();
m_dsPictures_Sections.WriteXml(Server.MapPath("Pictures.xml"));
Response.Redirect("ShowImages.aspx?event_images="+m_strTableName);
}
}
}
void LogOut(Object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect("Default.aspx");
}
</script>
<head>
<title>NCCUMC Youth Conference: View Images</title><LINK href="global.css" type="text/css" rel="StyleSheet">
<META name="keywords" content="View Images">
<META name="description" content="UMYFEvents.com: View Images">
<meta name="author" content="Steven Hicks, support@404Browser.com">
</head>
<body>
<form enctype="multipart/form-data" runat="server">
<div align="center">
<asp:Image id="m_strMain_Image" runat="server" />
<asp:Panel ID="adminPanel" Runat="server" Visible="False">
<asp:ImageButton ID="m_cAdminDel" ImageUrl="./Images/adminDel.png" OnClick="adminDel" Runat="server"></asp:ImageButton>
</asp:Panel>
<br>
Submited By:
<asp:Label ID="m_strAuthor" Runat="server"></asp:Label>
</div>
<br>
<mbsp:ScrollingPanel ScrollbarVisibility="Visible" Width="600" id="m_cPanel" wrap="False" runat="server" />
</form>
</body>
Mengembalikan multiple resultset dengan data reader
Ada metode untuk dataReader yaitu NextResult, yang memungkinkan untuk melakukan batch query (multiple SELECT statement dalam satu string), yang membutuhkan hanya sekali jalan ke database, kemudian dengan NextResult mengakses setiap result set untuk mengambil data.
Untuk memperjelas teknik ini, diberikan contoh dengan select dari empat buah tabel yang berbeda pada database Northwind.
Berikut adalah .aspx nya :
<%@ Page Language="vb" Src="ManyResults.aspx.vb" Inherits="DotNetJohn.ManyResults"% >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html >
<head >
<title >ManyResults</title >
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0" >
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0" >
<meta name=vs_defaultClientScript content="JavaScript" >
<meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5" >
</head >
<body >
<form id="Form1" method="post" runat="server" >
<table >
<tr >
<td bgcolor="#EEEEEE" align="right" >Category Name:</td >
<td ><asp:DropDownList ID="ddlCategoryName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Company Name:</td >
<td ><asp:DropDownList ID="ddlCompanyName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Last Name:</td >
<td ><asp:DropDownList ID="ddlLastName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Product Name:</td >
<td ><asp:DropDownList ID="ddlProductName" Runat="server" / ></td >
</tr >
</table >
</form >
</body >
</html >
Berikut adalah kode class nya :
Imports System
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
NameSpace DotNetJohn
Public Class ManyResults : Inherits System.Web.UI.Page
Protected ddlCategoryName As DropDownList
Protected ddlCompanyName As DropDownList
Protected ddlLastName As DropDownList
Protected ddlProductName As DropDownList
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim objConn As SqlConnection
Dim objCmd As SqlCommand
Dim dataReader As SqlDataReader
Dim strSql As String
objConn = New SqlConnection(ConfigurationSettings.AppSettings.Get("ConnectionString"))
strSql = _
"SELECT CategoryName FROM Categories ORDER BY CategoryName;" _
& "SELECT Top 10 CompanyName FROM Customers ORDER BY CompanyName;" _
& "SELECT LastName FROM Employees ORDER BY LastName;" _
& "SELECT Top 10 ProductName FROM Products ORDER BY ProductName;"
objCmd = New SqlCommand(strSql, objConn)
Try
objConn.Open()
dataReader = objCmd.ExecuteReader()
'CategoryName
With ddlCategoryName
.DataSource = dataReader
.DataTextField = "CategoryName"
.DataValueField = "CategoryName"
.DataBind()
End With
'CompanyName
dataReader.NextResult()
With ddlCompanyName
.DataSource = dataReader
.DataTextField = "CompanyName"
.DataValueField = "CompanyName"
.DataBind()
End With
'LastName
dataReader.NextResult()
With ddlLastName
.DataSource = dataReader
.DataTextField = "LastName"
.DataValueField = "LastName"
.DataBind()
End With
'ProductName
dataReader.NextResult()
With ddlProductName
.DataSource = dataReader
.DataTextField = "ProductName"
.DataValueField = "ProductName"
.DataBind()
End With
Catch exc As Exception
Response.Write(exc)
Finally
If Not dataReader Is Nothing Then
dataReader.Close()
End If
objCmd = Nothing
If objConn.State = ConnectionState.Open Then
objConn.Close()
End If
objConn.Dispose()
End Try
End Sub
End Class
End NameSpace
Tampak begitu mudah dan sederhana untuk memperoleh beberapa resultset sekali jalan ke server database dan mengakses resultset satu persatu untuk memperoleh data yang diperlukan.
Mengembalikan multiple resultset dengan data reader
Ada metode untuk dataReader yaitu NextResult, yang memungkinkan untuk melakukan batch query (multiple SELECT statement dalam satu string), yang membutuhkan hanya sekali jalan ke database, kemudian dengan NextResult mengakses setiap result set untuk mengambil data.
Untuk memperjelas teknik ini, diberikan contoh dengan select dari empat buah tabel yang berbeda pada database Northwind.
Berikut adalah .aspx nya :
<%@ Page Language="vb" Src="ManyResults.aspx.vb" Inherits="DotNetJohn.ManyResults"% >
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html >
<head >
<title >ManyResults</title >
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0" >
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0" >
<meta name=vs_defaultClientScript content="JavaScript" >
<meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5" >
</head >
<body >
<form id="Form1" method="post" runat="server" >
<table >
<tr >
<td bgcolor="#EEEEEE" align="right" >Category Name:</td >
<td ><asp:DropDownList ID="ddlCategoryName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Company Name:</td >
<td ><asp:DropDownList ID="ddlCompanyName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Last Name:</td >
<td ><asp:DropDownList ID="ddlLastName" Runat="server" / ></td >
</tr >
<tr >
<td bgcolor="#EEEEEE" align="right" >Product Name:</td >
<td ><asp:DropDownList ID="ddlProductName" Runat="server" / ></td >
</tr >
</table >
</form >
</body >
</html >
Berikut adalah kode class nya :
Imports System
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
NameSpace DotNetJohn
Public Class ManyResults : Inherits System.Web.UI.Page
Protected ddlCategoryName As DropDownList
Protected ddlCompanyName As DropDownList
Protected ddlLastName As DropDownList
Protected ddlProductName As DropDownList
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim objConn As SqlConnection
Dim objCmd As SqlCommand
Dim dataReader As SqlDataReader
Dim strSql As String
objConn = New SqlConnection(ConfigurationSettings.AppSettings.Get("ConnectionString"))
strSql = _
"SELECT CategoryName FROM Categories ORDER BY CategoryName;" _
& "SELECT Top 10 CompanyName FROM Customers ORDER BY CompanyName;" _
& "SELECT LastName FROM Employees ORDER BY LastName;" _
& "SELECT Top 10 ProductName FROM Products ORDER BY ProductName;"
objCmd = New SqlCommand(strSql, objConn)
Try
objConn.Open()
dataReader = objCmd.ExecuteReader()
'CategoryName
With ddlCategoryName
.DataSource = dataReader
.DataTextField = "CategoryName"
.DataValueField = "CategoryName"
.DataBind()
End With
'CompanyName
dataReader.NextResult()
With ddlCompanyName
.DataSource = dataReader
.DataTextField = "CompanyName"
.DataValueField = "CompanyName"
.DataBind()
End With
'LastName
dataReader.NextResult()
With ddlLastName
.DataSource = dataReader
.DataTextField = "LastName"
.DataValueField = "LastName"
.DataBind()
End With
'ProductName
dataReader.NextResult()
With ddlProductName
.DataSource = dataReader
.DataTextField = "ProductName"
.DataValueField = "ProductName"
.DataBind()
End With
Catch exc As Exception
Response.Write(exc)
Finally
If Not dataReader Is Nothing Then
dataReader.Close()
End If
objCmd = Nothing
If objConn.State = ConnectionState.Open Then
objConn.Close()
End If
objConn.Dispose()
End Try
End Sub
End Class
End NameSpace
Tampak begitu mudah dan sederhana untuk memperoleh beberapa resultset sekali jalan ke server database dan mengakses resultset satu persatu untuk memperoleh data yang diperlukan.
Debugging ASP.NET dengan Notepad
< @ Page Debug="True" % >
Tracing menyediakan banyak informasi tentang bagaimana halaman diproses dan apa yang terjadi selama pemrosesan.
Beberapa informasi yang ditampilkan :
1.Request Details
Bagaimana request dikirimkan (secara GET/POST)
2.Trace Information
Menampilkan setiap event yang terjadi pada halaman dan berapa lama event itu berlangsung.
3.Control Tree
Menampilkan semua control di halaman, apa saja dan ukurannya, serta jumlah viewstate yang dipakai
4.Cookies Collection
Cookie apapun, nilai dan ukurannya
5.Headers Collection
Header yang ditampilkan beserta halaman
6.Server Variables
Semua variabel server, yang dapat digunakan untuk informasi nama server, port
7.Form Collection
Daftar variabel POST yang dikirimkan maupun diterima
Trace.Write
Gunakan metode ini untuk menuliskan informasi pada trace log
Trace.Write ("Quick Ref","Test Trace")
Ini juga dapat digunakan untuk dengan cepat mencetak nilai string
Sub page_load(sender as object, e as EventArgs)
ds.ReadXML(Server.MapPath("bind.xml"))
dg.DataSource = ds.Tables(0)
Trace.Write("Page_Load", "Datagrid datasource - " & dg.DataSource.ToString)
dg.DataBind()
End Sub
Sub dg_itemcreate(sender as object, e as DataGridItemEventArgs)
If e.item.itemtype = ListItemType.Item OR
e.item.itemtype = ListItemType.AlternatingItem Then
Dim dv as new DataView(ds.Tables(2))
Dim lbltxt As ListBox = CType(e.Item.FindControl("lbltxt"), ListBox)
dv.RowFilter = "developers_Id = '" &
ds.Tables(0).Rows(e.item.itemindex)(2).ToString & "'"
lbltxt.DataSource = dv
lbltxt.DataTextField = "developer_Text"
lbltxt.DataBind()
Trace.Write("DG", "Listbox Created")
End If
End Sub
Menuliskan string
Terkadang cara paling efektif untuk debug adalah mencetak string yang mungkin menyebabkan error,kita semua pasti pernah ya :)
Ini termasuk cara efektif, tanpa harus menyalakan Trace dan mencetak Trace Log
CLR Debugger
CLR Debugger terletak [.NET Framework install path]\FrameworkSDK\GuiDebug yang tampak seperti ini
l:\program files\Microsoft.NET\FrameworkSDK\GuiDebug
Untuk melakukannya, load debugger dan buka file yang akan di-debug.
Goto -
Tools -> Debug Process
Kemudian cari proses aspnet_wp.exe dan attach
Kemudian tentukan Breakpoint dalam kode dan jalankan
Tool ini sepert lite-VS.NET Debugger. Fitur lain yang dapat digunakan dialog Exceptions, dimana kita dapat memilih exception yang mau di-baypass
Enchanced List Box
private void AddRemoveAll(ListBox aSource, ListBox aTarget)
{
try
{
foreach(ListItem item in aSource.Items)
aTarget.Items.Add(item);
aSource.Items.Clear();
}
catch(Exception expException)
{
Response.Write(expException.Message);
}
}
Method ini digunakan untuk memindahkan item tertentu dari listbox sumber ke listbox tujuan
private void AddRemoveItem(ListBox aSource, ListBox aTarget)
{
ListItemCollection licCollection;
try
{
licCollection = new ListItemCollection();
for(int intCount=0;intCount < aSource.Items.Count;intCount++)
{
if(aSource.Items[intCount].Selected==true)
licCollection.Add(aSource.Items[intCount]);
}
for(int intCount=0;intCount < licCollection.Count;intCount++)
{
aSource.Items.Remove(licCollection[intCount]);
aTarget.Items.Add(licCollection[intCount]);
}
}
catch(Exception expException)
{
Response.Write(expException.Message);
}
finally
{
licCollection = null;
}
}
Method ini digunakan untuk menggeser posisi item ke atas
private void private void MoveUp(ListBox lstBox)
{
int iIndex, iCount, iOffset, iInsertAt,iIndexSelectedMarker = -1;
string lItemData,lItemval;
try
{
// Get the count of items in the list control
iCount = lstBox.Items.Count;
// Set the base loop index and the increment/decrement value based
// on the direction the item are being moved (up or down).
iIndex = 0;
iOffset = -1;
// Loop through all of the items in the list.
while(iIndex < iCount)
{
// Check if this item is selected.
if(lstBox.SelectedIndex > 0)
{
// Get the item data for this item
lItemval =lstBox.SelectedItem.Value.ToString();
lItemData = lstBox.SelectedItem.Text.ToString() ;
iIndexSelectedMarker=lstBox.SelectedIndex;
// Don't move selected items past other selected items
if(-1 != iIndexSelectedMarker)
{
for(int iIndex2 = 0; iIndex2 < iCount; ++iIndex2)
{
// Find the index of this item in enabled list
if(lItemval == lstBox.Items[iIndex2].Value.ToString())
{
// Remove the item from its current position
lstBox.Items.RemoveAt(iIndex2);
// Reinsert the item in the array one space higher
// than its previous position
iInsertAt=(iIndex2 + iOffset)<0?0:iIndex2+iOffset;
ListItem li= new ListItem(lItemData,lItemval);
lstBox.Items.Insert(iInsertAt,li);
break;
}
}
}
}
// If this item wasn't selected save the index so we can check
// it later so we don't move past the any selected items.
else if(-1 == iIndexSelectedMarker)
{
iIndexSelectedMarker = iIndex;
break;
}
iIndex = iIndex + 1;
}
if(iIndexSelectedMarker==0)
lstBox.SelectedIndex=iIndexSelectedMarker;
else
lstBox.SelectedIndex=iIndexSelectedMarker-1;
}
catch(Exception expException)
{
Response.Write(expException.Message);
}
}
Method ini digunakan untuk menggeser posisi item ke bawah
private void MoveDown(ListBox lstBox)
{
try
{
int iIndex, iCount, iOffset, InsertAt,iIndexSelectedMarker = -1;
string lItemData;
string lItemval;
// Get the count of items in the list control
iCount = lstBox.Items.Count;
// Set the base loop index and the increment/decrement value based on
// the direction the item are being moved (up or down).
iIndex = iCount - 1;
iOffset = 1;
// Loop through all of the items in the list.
while(iIndex >= 0)
{
// Check if this item is selected.
if(lstBox.SelectedIndex >= 0)
{
// Get the item data for this item
lItemData = lstBox.SelectedItem.Text.ToString();
lItemval =lstBox.SelectedItem.Value.ToString();
iIndexSelectedMarker=lstBox.SelectedIndex;
// Don't move selected items past other selected items
if(-1 != iIndexSelectedMarker)
{
for(int iIndex2 = 0; iIndex2 < iCount-1; ++iIndex2)
{
// Find the index of this item in enabled list
if( lItemval == lstBox.Items[iIndex2].Value.ToString())
{
// Remove the item from its current position
lstBox.Items.RemoveAt(iIndex2);
// Reinsert the item in the array one space lower
// than its previous position
iInsertAt=(iIndex2+iOffset) < 0?0:iIndex2+iOffset;
ListItem li = new ListItem(lItemData,lItemval);
lstBox.Items.Insert(iInsertAt,li);
break;
}
}
}
}
iIndex = iIndex - 1;
}
if(iIndexSelectedMarker==lstBox.Items.Count-1)
lstBox.SelectedIndex=iIndexSelectedMarker;
else
lstBox.SelectedIndex=iIndexSelectedMarker+1;
}
catch(Exception expException)
{
Response.Write(expException.Message);
}
}
Solusi Kompresi SQL server report (Zip format)
Syarat-syarat:
1.SharpZipLib – sebuah Open Source .Net zip library (Download URL: http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx)
2.Sebuah kontrol akses penuh pada folder Temp project pada server dimana aplikasi berada.
Procedure yang dijalankan di bawah ini akan dapat digunakan jika data pada report besar
1.Dapatkan data report pada form array byte melalui reporting web service
2.Cek panjang array byte, jika itu melebihi limit/batas yang dispesifikasikan maka report harus dikompres
3.Spesifikasikan nama file dan ekstensi untuk report yang akan disimpan pada Temp folder
4. Ciptakan/Buatlah file report pada temp folder
5. Zip report yang disimpan dalam temp folder dan hapus file report
6. Ijinkan user untuk men-download file zip yang disimpan melalui browser
7. Kosongkan temp folder secara periodik melalui procedure thread terpisah
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">ReportingService objReportService = new ReportService.ReportingService();<SPAN style="mso-tab-count: 4">
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">NetworkCredential objCredentials = new NetworkCredential("","","");
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objReportService.Credentials = objCredentials;<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 5">
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 5"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">string strDSNPath = "" // Report DSN path ;
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">string strReportFolderName = "" // Report folder name;
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><o:p><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT- FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">string strDataSourceName<SPAN style="mso-spacerun: yes"> = "" // DataSourceName;<o:p></o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">ReportService.DataSourceReference objDataSourceReference = new ReportService.DataSourceReference();<o:p></o:p>
</o:p><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT- FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objDataSourceReference.Reference = "\"+ strDSNPath;<o:p></o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objArrDataSources = new ReportService.DataSource[1];<o:p></o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objDataSources = new ReportService.DataSource();
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objDataSources.Item = (ReportService.DataSourceDefinitionOrReference) objDataSourceReference;<o:p></o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objDataSources.Name = strDataSourceName;<o:p></o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><o:p><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT- FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objArrDataSources[0] = objDataSources;
</o:p>
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objReportService.SetReportDataSources(strReportName.Trim(), objArrDataSources);
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT- SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">//Device Information settings....Section attribute made to zero to show all the results.
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">//if this is made to 1 shows the first report only.
strDeviceInfo="<DeviceInfo><HTMLFragment>True</HTMLFragment><Section>0</Section></DeviceInfo>";
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">//Passing parameters to report
arrParameters = new ReportService.ParameterValue[intHTCount];
if (objHTParameters !=null)
{
intHTCount=objHTParameters.Count;
arrParameters = new ReportService.ParameterValue[intHTCount];
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"> IDictionaryEnumerator enumParameterList = objHTParameters.GetEnumerator();
while ( enumParameterList.MoveNext() )
{
arrParameters[intParameterCount]=new ReportService.ParameterValue();
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"> arrParameters[intParameterCount].Name = enumParameterList.Key.ToString();
arrParameters[intParameterCount].Value = enumParameterList.Value.ToString();
intParameterCount=intParameterCount+1;
}
}
objReportService.Timeout = -1;
//Mendapatkan report dari web service berupa byte
byteResultStream = objReportService.Render(strReportName, strReportType, strHistoryID,strDeviceInfo,arrParameters,
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">objDataSourceCredentials,strShowHideToggle,out strEncoding,out strMimeType,out objParametersUsed,out objWarnings,
<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">out strArrStreamIdentifiers);<SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'"><SPAN style="FONT-SIZE: 9pt; COLOR: gray; FONT-FAMILY: 'Courier New'">
Dua Method Private yang digunakan:
A. WriteFile: method ini digunakan untuk menulis report pada the temp folder. Di bawah ini adalah codenya.
Parameter:
strpath –string yang menahan path di mana report file disimpan.
strFileNameWithExt – String yang menahan nama report file dengan ekstensi (.html, .pdf, .xls etc).
byteResultStream – byte array yang menahan data report pada form bytes.
Method:
private int WriteFile (string strPath, string strFileNameWithExt,byte[] byteResultStream)
{
I int intResult = 0;
FileStream stream = File.OpenWrite(@strPath+strFileNameWithExt);
stream.Write(byteResultStream, 0, byteResultStream.Length);
stream.Close();
intResult = ”1”;
return intResult;
#endregion
}
B. CreateZip: method ini digunakan digunakan untuk zip report file yang disimpan.
Parameter:
strFileName – string yang menahan nama file tanpa ekstensi
strFileNameWithExt – string yang menahan nama file dengan ekstensi
Method :
private string CreateZip(string strFileName,string strFileNameWithExt)
{
string strZipFileName = string.Empty;
Crc32 objCrc32 = null;
ZipOutputStream objZipOutputStream = null;
ZipEntry objZipEntry = null;
string strPath = string.Empty;
#endregion
strPath = HttpContext.Current.Server.MapPath(“\Temp”);
if (File.Exists(strPath+strFileNameWithExt))
{
strZipFileName = strPath+strFileName+”.zip”;
objCrc32 = new Crc32();
objZipOutputStream = new ZipOutputStream(File.Create(strZipFileName));
objZipOutputStream.SetLevel(6);
FileStream objFileStream = File.OpenRead(strPath+strFileNameWithExt);
Byte[] abyBuffer = new Byte[objFileStream.Length];
objFileStream.Read(abyBuffer, 0, abyBuffer.Length);
objZipEntry = new ZipEntry(strFileNameWithExt);
objZipEntry.DateTime = DateTime.Now;
objZipEntry.Size = objFileStream.Length;
objFileStream.Close();
objCrc32.Reset();
objCrc32.Update(abyBuffer);
objZipEntry.Crc = objCrc32.Value;
objZipOutputStream.PutNextEntry(objZipEntry);
objZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length);
objZipOutputStream.Finish();
objZipOutputStream.Close();
strZipFileName = strFileName+”.zip”;
return strZipFileName;
}
Membuat status bar dalam aplikasi web
Permasalahannya adalah aplikasi web tidak bekerja secara run time, tetapi server menyelesaikan proses baru mengirimkan kode ke client. Tetapi dengan sedikit JavaScript, kemampuan untuk menulis dan membaca teks file, kemampuan untuk include file, maka bisa dibuat proses sederhana untuk terus menginformasikan ke user status dari proses.
StatusBar.aspx
-----------------------------
< %@ Page Language="C#" Debug="true" % >
< %@ import Namespace="System.IO" % >
< %@ import Namespace="System.Threading" % >
< script runat="server" >
const int NUMBER_OF_ITEMS_TO_PROCESS = 10;
void Page_Load(Object sender, EventArgs e) {
//Thread.Sleep(1000);
UpdateStatus(GetCounter());
SetCounter(GetCounter() + 1);
if(GetCounter() > NUMBER_OF_ITEMS_TO_PROCESS) {
Response.Redirect("Finished.aspx");
}
}
private void UpdateStatus(int counter) {
FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("status.htm"));
StreamWriter sw = fi.AppendText();
if(counter < NUMBER_OF_ITEMS_TO_PROCESS) {
sw.WriteLine(counter + ", ");
} else {
sw.WriteLine(counter + ".");
}
sw.Flush();
sw.Close();
}
public void SetCounter(int counter) {
FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("Counter.txt"));
StreamWriter sw = fi.CreateText();
sw.WriteLine(counter.ToString());
sw.Flush();
sw.Close();
}
public int GetCounter() {
FileInfo file = new FileInfo(HttpContext.Current.Server.MapPath("Counter.txt"));
StreamReader sr = file.OpenText();
int counter = Int32.Parse(sr.ReadLine());
sr.Close();
return counter;
}
< /script >
< html >
< head >
< meta http-equiv="refresh" content=".1" >
< /head >
< body >
< /body >
< /html >
< !--#include file="status.htm" -- >
StartProcess.aspx
-------------------------------------------------
< %@ Page Language="C#" % >
< %@ import Namespace="System.IO" % >
< script runat="server" >
void Page_Load(Object sender, EventArgs e) {
ClearStatus();
SetCounter(1);
Response.Redirect("StatusBar.aspx");
}
private void ClearStatus() {
FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("status.htm"));
StreamWriter sw = fi.CreateText();
sw.WriteLine("Processing 10 Records...< br >< br >");
sw.Flush();
sw.Close();
}
public void SetCounter(int counter) {
FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("Counter.txt"));
StreamWriter sw = fi.CreateText();
sw.WriteLine(counter.ToString());
sw.Flush();
sw.Close();
}
< /script >
< html >
< head >
< /head >
< body >
< form runat="server" >
< !--#include file="status.htm" -- >
< br >
Process is finished.< br >
< br >
< a href="StartProcess.aspx" >Start process again< /a >.
< /form >
< /body >
< /html >
Finished.aspx
--------------------------------------------
< %@ Page Language="C#" % >
< %@ import Namespace="System.IO" % >
< html >
< head >
< /head >
< body >
< form runat="server" >
< !--#include file="status.htm" -- >
< br >
Process is finished.< br >
< br >
< a href="StartProcess.aspx" >Start process again< /a >.
< /form >
< /body >
< /html >
Counter.txt
-----------------------------
1
Please Wait Button
<%@ Page language="C#" %>
<%@ Register TagPrefix="cc1" Namespace="JavaScriptControls"
Assembly="PleaseWaitButton" %>
Method ini digunakan untuk me-render HTMLTextWriter
protected override void Render(HtmlTextWriter output)
{
// Output the button's html (with attributes)
// to a dummy HtmlTextWriter
StringWriter sw = new StringWriter();
HtmlTextWriter wr = new HtmlTextWriter(sw);
base.Render(wr);
string sButtonHtml = sw.ToString();
wr.Close();
sw.Close();
// now modify the code to include an "onclick" handler
// with our PleaseWait() function called appropriately
// after any client-side validation.
sButtonHtml = ModifyJavaScriptOnClick(sButtonHtml);
// before rendering the button, output an empty
// that will be populated client-side via javascript
// with a "please wait" message"
output.Write(string.Format("
this.ClientID));
output.Write("
// render the button in an encapsulating
output.Write(string.Format("
this.ClientID));
output.Write(sButtonHtml);
output.Write("
}
info lebih lengkap dapat dilihat di
http://www.codeproject.com/aspnet/PleaseWaitButton.asp
Implementing a Dialog Box in ASP.NET Based Web Application
Dialog box bisa digunakan untuk memberikan beberapa feedback kepada user atau untuk mendapatkan beberapa input dari user ataupun keduanya. Misalnya :
Dim fChild As New frmChild
frmChild.Show vbModal
Dalam teknik berikut ini akan mengimplementasikan dialog box dalam suatu web based application.
Simple Dialog Box
Teknik pertana dan biasa digunakan untuk mengimplementasikan dialog box adalah dengan meletakkan javascript untuk event tertentu (biasanya event click) dari suatu kontrol. Caranya sebenarnya sangat mudah jika aplikasi kita sudah mengetahui waktu membuka dialog box di saat page diload ke browser.
Contoh berikut ini adalah untuk meletakkan button form control ke web page dengan menginsertkan kode berikut.
btnOpen1.Attributes.Add("onclick", "alert('GOT IT?');")
Cukup satu baris perintah yg digunakan untuk membangkitkan alert message ke user.
Dengan cara yg sama, jika kita menginginkan aplikasi membuka sebuah box dialog konfirmasi dari tempat dimana user bisa memilih optionnya. Misalnya, jika ingin membuka confirmation dialog box pada waktu user mengklik button delete dari suatu page :
btnDelete.Attributes.Add("onclick", "if(confirm('Are you sure to delete?')){}else{return false}")
Code itu akan membangkitkan kode javascript kecil ke browser. Jika user memilih "No" dari confirmation dialog box, maka akan mengembalikan nilai false, artinya tidak terjadi apa-apa. Dan jika user memilih "Yes", maka akan mengembalikan true dan akan melakukan post halaman tersebut.
Open Dialog Box with Another Web Form
Jika ingin membuka web page yg lain sebagai sebuah dialog box, maka bisa menggunakan perintah berikut ini yg sedikit berbeda dari sebelumnya :
btnOpen2.Attributes.Add("onclick", "window.open ('child.aspx')")
btnOpen merupakan web form control dan pada waktu user mengklik button tersebut, akan membuka instance browser yg lain dengan page "child.aspx".
Untuk membuka sebuah halaman dalam browser yg sama dengan menggunakan modal dialog box, maka bisa mengikuti contoh perintah di bawah ini :
btnOpen3.Attributes.Add("onclick", "window.showModalDialog('child.aspx', null,'status:no;dialogWidth:370px;dialogHeight:220px;dialogHide:true;help:no;scroll:no');")
Untuk kode diatas sebenarnya tidak melakukan sesuatu. Dia hanya membuatkan kode javascript sederhana dan meletakkan even click dari kontrol ke script tersebut. Jika kita melihat source code html dari page tersebut, maka bisa kita temukan bahwa html code dari page ini yg dibuat dengan popup dialog box diatas.
Returning value from the dialog box
Untuk mengembalikan semua nilai ke parent window dari child dialog box, javascript menyediakan satu atribut dari objek window, yaitu window.returnValue. Untuk memahami cara kerjanya, berikut ini diberikan contoh web project kecil dengan 2 web form, yaitu parent.aspx dan child.aspx .
Parent web form ini akan mempunyai 1 textbox dan 1 button.
parent.aspx
parent.aspx.vb
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
btnOpen.Attributes.Add("onclick", "var strReturn; strReturn=window.showModalDialog('child2.aspx',null,'status:no;dialogWidth:370px;dialogHeight:220px;dialogHide:true;help:no;scroll:no');if (strReturn != null) document.getElementById('txtValue').value=strReturn;")
End Sub
Dan, child web form berikut ini akan mempunyai 1 textbox and 2 button.
child2.aspx
child2.aspx.vb
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
btnOK.Attributes.Add("onclick", "window.returnValue = document.getElementById('txtValue').value; window.close();") btnCancel.Attributes.Add("onclick", "window.close();")
End Sub
Adapun tujuan dari modul kecil ini adalah bahwa pd waktu user mengklik button dari form parent, maka akan membuka file child.aspx dalam dialog box. Dalam form child, user akan memasukkan beberapa nilai dalam textbox dan jika button OK diklik maka akan mengembalikan nilai ke form parent. Dengan cara itu, akan mengupdate isi textbox dari form parent. Sebaliknya, jika mengklik button Cancel, akan menutup child dialog box tanpa melakukan sesuatu apapun.
Dari semua kasus diatas, tidak ada yg tidak dapat dilakukan dengan ASP.NET. Semua hal sebenarnya ditangani oleh javascript. Berikut ini kode javascript dari child web form.
Dalam child web form, suatu nilai yg dikembalikan diberikan ke window.returnValue. Dana return value tersebut diberikan ke sebuah variabel dalam parent web form. Kemudian, setelah itu diberikan ke textbox.
Dalam hal ini, window.returnValue mengembalikan beberapa nilai dari child window ke parent window, dan setelah itu kita bisa melakukan apa saja dengan nilai yg telah dikembalikan tersebut. Kita bisa mempassing ke VB code menggunakan parameter dari query string dari suatu document action.
Tidak ada batasan dalam menggunakan method pengembalian nilai dari suatu dialog box tersebut. Batasan yg ada adalah bahwa kita hanya bisa mengembalikan 1 value ke parent window.
Dalam contoh berikut ini, akan membangkitkan alert message yg sederhana ke user (dalam VB).
Private Sub btnOpen5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen5.Click
Dim strScript As String = ""
strScript = ""
Response.Write(strScript)
End Sub
Jika ingin menampilkan beberapa variabel sekaligus dalam sekali tampil,
Private Sub btnOpen6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen6.Click
Dim strScript As String = ""
Dim intSum As Integer
strScript = ""
Response.Write(strScript)
End Sub
Kesimpulan:
Mengimplementasikan dialog box dalam web based application membuat aplikasi kita lebih usable. Karena hal itu memungkinkan aplikasi kita untuk berkomunikasi lebih dekat dengan user.
Tracing web application dengan ASP.NET
1. Pada page
Ketika method ini digunakan, output trace ditampilkan pada page yang dijalankan.
2. Di luar page
Pada metode ini, hasil trace tidak akan ditampilkan pada page tetapi disimpan dalam web server dan pada folder root aplikasi pada sebuah file diberi nama trace.axd. Setelah mengeksekusi page, file ini dapat ditampilkan di browser. Sebagai contoh, http://yourApplicationroot/trace.axd.
Bagaimana cara melakukan tracing
Tracing dapat dilakukan pada 2 bagian yaitu:
1. Page Level
2. Application Level
Keterangan:
1.Bekerja dengan Page Level Tracing
Page level tracing dapat dibolehkan menggunakan page directive menggunakan “Trace”. Jika kamu melihat bagian atas halaman, kamu akan menemukan sebuah baris seperti berikut :
<%@ Page Language="vb" AutoEventWireup="False" Trace="True"
Codebehind="TraceTest.aspx.vb" Inherits="TracingExample.Test"%>
Juga, kita mempunyai objek Trace inbuilt untuk membolehkan dan menghalangi tracing secara dinamik. Pada page, event on Load
jika dituliskan seperti berikut maka tracing akan dibolehkan
Trace.IsEnabled = True
2. Bekerja dengan Application Level Tracing
When you are working with page level Tracing, you need to know probable page that is to be traced. If your application is complex and if you want to trace you might not be aware exact page that is to be traced. To avoid this problem we, .NET platform, provides a facility to enable the tracing at application level.
Seperti kita ketahui bahwa web.config adalah sebuah file yang mengatur setting application level. Pada file yang sama disebutkan setting trace
<trace enabled="true" pageOutput="true" requestLimit="10"
traceMode="SortByTime" localOnly="true" />
Atribut-atribut tag trace adalah sebagai berikut:
Enabled - membolehkan or menghalangi tracing untuk aplikasi secara keseluruhan.
PageOutput – Jika atribut ini bernilai true maka trace output akan ditampilkan di layar. Jika nilainya false, output trace akan diterima menggunakan browser.
RequestLimit–Atribut ini digunakan untuk menentukan jumlah page yang diminta untuk di-trace.
TraceMode – Untuk mengatur permintaan trace output. Sevagai contoh – SortByTime, SortByCategory ,dll.
localOnly - Atur atribut ini menjadi "false" jika kamu ingin mengakses log trace dari beberapa client.
Trace Output mengandung banyak detail, beberapa section sebagai berikut:
a. Request Details
b. Trace Information
c. Control Tree
d. Cookies Collection
e. Header Information
f. Server Variables
Cara lain adalah menggunakan trace object. Sebuah teknik yang umum untuk passing parameter menggunakan QueryString dan membolehkan atau menghalangi trace.
Sebagai contoh, kamu menulis code dibawah ini pada event page load
If (Context.Request.QueryString("EnableTrace") = "true") Then
Context.Trace.IsEnabled = True
End If
Dan kamu memberi URL untuk membolehkan trace:
http://MyAppRoot/mypage.aspx?EnableTrace=true
Untuk menulis trace, kita menggunakan objek yang sama. Di manapun pada page, jika baris di bawah ini ditulis, trace output akan menghasilkan sama.
If Trace.IsEnabled Then
Trace.Write (“Sample trace output / Custom message”)
End if
Juga, dapat menggunakan method warn. Ketika method warn digunakan, trace output akan menampilkan pesan warna merah.
If Trace.IsEnabled Then
Trace.Warn (“Sample trace output / Warning / Custom message”)
End If
Menskala Gambar yang diambil dari SQL server
Pertama-tama kita harus mendapatkan atau mengambil data dari database dengan menggunakan
program berikut ini
SqlCommand cmd = new SqlCommand( "SELECT image FROM images WHERE id=@id" , connection);
cmd.Parameters.Add( "@id" , Request.QueryString[ "id" ]);
SqlDataReader dr = cmd.ExecuteReader();
kemudian kita harus mengalokasiksn array of bytes untuk menampung image,
byte[] image = null;
while (dr.Read())
{
image = (byte[])dr.GetValue(0);
}
dr.Close()
Sekarang kita memiliki array of byte yang mengandung gambar, kemuadian kita dapat menuliskan array
tersebut menjadi bitmap.
Bitmap b = (Bitmap)Bitmap.FromStream( new MemoryStream(image));
Lalu kita dapat meskala gambar tersebut dengan menggunakan constructor bitmap yang dioverload
Bitmap output = new Bitmap(b, new Size(320, 240);
Setelah diskala maka kita dapat menyimpan gambar tersebut atau mengirimkanya kemana saja, bahkan
dengan menggunakan response.outputstream
Meng-embed (menyertakan) text pada gambar
pada html.
Berikut ini adalah program yang dapat melakukan hal tersebut diatas
image_text.aspx
< %@ Page Language="c#"%>
< %@ Import Namespace="System.Drawing.Imaging" %>
< %@ Import Namespace="System.Drawing" %>
< %@ Import Namespace="System.Drawing.Drawing2D" %>
< script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Bitmap bmp= new Bitmap(Server.MapPath(Request.QueryString["i"]));
Graphics g=Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias ;
g.DrawString(Request.QueryString["t"],
new Font("verdana",12),SystemBrushes.WindowText, 1, 1);
Response.ContentType="image/jpeg";
bmp.Save(Response.OutputStream, bmp.RawFormat) ;
}
< /script >
sebagai contoh, cobalah masuk pada
http://www.charon.co.uk/demos/image_text.aspx?i=/file_library/images/articles/jules_photo.jpg&t=Photo+of+Jules.
coba ganti-ganti querystring dan lihat perubahan yang terjadi pada judulnya.
Mendapatkan array yang berisi semua file yang ada pada direktori
file yang terdapat pada sebuah direktori
< %@ Page Language="C#" %>
< %@ Import Namespace="System.IO" %>
< script runat="server">
void Page_Load(object sender, EventArgs e) {
FileInfo fi = new FileInfo(Server.MapPath(""));
DirectoryInfo di = fi.Directory;
FileSystemInfo[] fsi = di.GetFiles();
Response.Write("The directory contains the following files and directories:" + di.FullName + "< hr> ");
foreach (FileSystemInfo info in fsi)
Response.Write(info.Name + "< br> ");
}
< /script>
Color Translator
yang terdapat pada namespace System.Drawing. Class ini mempunyai method static bernama FromHtml(string). Method
ini menerima input berupa string dan mengembalikan instance warna yang bersesuaian
Jika inputan string berupa nama warna yang dikenali, maka method tersebut akan mengembalikan instance warna
yang sesuai, jika inputan string yang dimasukan berupa bilangan hexadesimal, maka method tersebut akan
mengambil komponen red green blue dan kemudian dengan menggunakan method color.fromargb() akan membentuk
instance warna yang sesuai
Berikut contoh penggunaan class colortranslator
'VB.NET...
LabelID.BackColor = ColorTranslator.FromHtml("#CCCC00")
// C#...
LabelID.BackColor = ColorTranslator.FromHtml("#CCCC00");
Menggubah nilai RGB menjadi warna
nilai-nilai ini menjadi instance warna, maka kita dapat menggunakan method fromargb(red,green,blue)
Contoh penggunaan method ini adalah sebagai berikut
'VB.NET...
TextBoxID.BackColor = Color.FromArgb(204, 204, 0)
// C#...
TextBoxID.BackColor = Color.FromArgb(204, 204, 0);
perlu dimengeri bahwa method ini dapat menerima parameter integer keempat sebagai nilai alpha dari warna,
nilai alpha ini adalah nilai transparansi dari warna. Bagaimanapun, komponen keempat ini tidak dapat
digunakan pada warna web site.
Memasukkan isi DropDownList ke XML
Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs)
Dim ds as new DataSet()
ds.ReadXml(Server.MapPath("BindXMLToDropDown.xml"))
DropDownList1.DataSource = ds
DropDownList1.DataTextField = "category"
DropDownList1.DataValueField = "category"
DropDownList1.DataBind()
end sub
‘program di bawah ini diketikkan pada bagian HTML dengan bahasa pemrograman java script
script language="JavaScript"
function SymError()
{
return true;
}
window.onerror = SymError;
var SymRealWinOpen = window.open;
function SymWinOpen(url, name, attributes)
{
return (new Object());
}
window.open = SymWinOpen;
var SymRealOnLoad;
var SymRealOnUnload;
function SymOnUnload()
{
window.open = SymWinOpen;
if(SymRealOnUnload != null)
SymRealOnUnload();
}
function SymOnLoad()
{
if(SymRealOnLoad != null)
SymRealOnLoad();
window.open = SymRealWinOpen;
SymRealOnUnload = window.onunload;
window.onunload = SymOnUnload;
}
SymRealOnLoad = window.onload;
window.onload = SymOnLoad;
‘OUTPUT yang dihasilkan :
-
-
-
-
Membentuk array yang berisi daftar file yang terdapat pada suatu directory
Page Language="C#"
Import Namespace="System.IO"
void Page_Load(object sender, EventArgs e) {
FileInfo fi = new FileInfo(Server.MapPath(""));
DirectoryInfo di = fi.Directory;
FileSystemInfo[] fsi = di.GetFiles();
Response.Write("The directory contains the following files and directories:" + di.FullName + "
");
foreach (FileSystemInfo info in fsi)
Response.Write(info.Name + "
");
}
Defibrillator : Menjaga session ASP.NET tetap ada sampai browser ditutup
1. Pengetahuan akan response
2. Pengetahuan refresh atribut HTTP header
3. akses property session
4. Memperjelas IFrame
Kamu akan menciptakan sebuah webform yang tidak berguna yang dipanggil Defibrillator.aspx. Kamu tidak perlu melakukan apa-apa dengan page ini hanya tambahkan satu baris pada Page_LOad pada code :
private void Page_Load(object sender, System.EventArgs e)
{
Response.AddHeader("Refresh", Convert.ToString((Session.Timeout*60)-10));
}
Kamu baru saja menambahkan atribut refresh HTTP header untuk Webform dan memberikan itu sebuah nilai pada session timeout dikurangi 10 detik. Itu berarti bahwa 10 detik sebelum session user akan timeout, selama browser masih buka, dan mereka masih dalam page-mu,page defibrillator akan mengirim sejumlah aliran listrik secara besar-besaran ke servermu.
Jika kamu ingin site-mu untuk post back secara tampak untuk menjaga session, maka harus ditambahkan 2 baris program di bawah ini
Pergi ke user controlmu di mana site menetap, seperti user control header atau footer. Kemudian tambahkan baris code dalam web form markup language
<IFRAME id=Defib src="/Defibrillator.aspx"
frameBorder=no width=0 height=0 runat="server"></IFRAME>
Menampilkan Image yang dikembalikan oleh RenderStream Method Sql Server Reporting Services
Masalah yang didapat adalah untuk memdapatkan image yang di-render untuk memunculkannya pada report. Ini menunjukkan bahwa resource ini adalah output tanpa ekstensi filem sehingga IE tidak yakin bagaimana cara untuk menangani mereka. Maka dari itu kamu harus mengkonfigurasi web server-mu
1. Pada IIS manager, arahkan ke directory dimana external resource yang akan di-render (ASPNET akan memerlukan untuk mendapat ijin ke directory ini untuk menciptakan resource secara sukses)
2. Buka page property untuk web aplikasimu, dan pilih tab HTTP
3. Klik 'MIME Types'
4. Klik 'New Type'
5. Pada 'Associated Extension', masukkan '*' (tanpa tanda kutip)
6. Pada 'Content Type (MIME)', masukkan 'image/png' (tanpa tanda kutip)
Membaca Informasi File Flash (.swf) Melalui Halaman ASP
Berikut class yang dibuat untuk proses pembacaan informasi tersebut
SWFDump Class
Properti Deskripsi
Version Versi dari Flash file (pada saat ini 3,4 atau 5)
Height Dinyatakan dalam pixels.
Width Dinyatakan dalam pixels.
xMin Dinyatakan dalam twips. (20 twips = 1 pixel)
xMax Dinyatakan dalam twips.
yMin Dinyatakan dalam twips.
yMax Dinyatakan dalam twips.
FileSize Ukuran total dari file .swf
FrameRate Banyak frame pada Flash File
FrameCounter Informasi counter frame
Penggunaan class SWFDump begitu sederhana. Pertama kali, letakkan class tersebut pada file include sehingga kita dapat dengan mudah memasukkan class tersebut pada file yang membutuhkan untuk membaca informasi file Flash. Include yang digunakan di sini bernama swfheaderdump.inc. Berikut source code untuk menggunakan class ini :
<%
'-------------------------------------------------------------
' Create Date : 17/10/2001 (dd/mm/yyyy)
' Mod. Date : 17/10/2001
' Author : Claudio Heidel (heidel@f256.com)
'-------------------------------------------------------------
' Pass the SWF name in querystring this way
' swfdump.asp?swf=yourmovie.swf
set myObj = new swfdump
myObj.SWFDump (Server.MapPath(request("swf")))
Response.Write "Heigt (pixel) = " & myObj.Heigt & "
"
Response.Write "Width (pixel) = " & myObj.Width & "
"
Response.Write "Version = " & myObj.Version & "
"
Response.Write "FileLen (bytes) = " & myObj.FileLen & "
"
Response.Write "xMin (twips) = " & myObj.xMin & "
"
Response.Write "xMax (twips) = " & myObj.xMax & "
"
Response.Write "yMin (twips) = " & myObj.yMin & "
"
Response.Write "yMax (twips) = " & myObj.yMax & "
"
Response.Write "FrameRate = " & myObj.FrameRate & "
"
Response.Write "FrameCount = " & myObj.FrameCount & "
"
%>
File swfheaderdump.inc membutuhkan definisi secara penuh dari class SWFDump :
<%
Class SWFDump
Private header
Private RECTdata
Private nBits
Private mversion
Private mfilelen
Private mxMin
Private mxMax
Private myMin
Private myMax
Private mheigt
Private mwidth
Private mframerate
Private mframecount
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
End Sub
Private Function ReadHeader (filename)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(filename, ForReading)
ReadHeader = f.Read(21)
End Function
Private Function ToBin(inNumber, OutLenStr )
Dim binary
binary = ""
do while inNumber >= 1
binary = binary & inNumber mod 2
inNumber = inNumber \ 2
loop
binary = binary & String(OutLenStr - len(binary), "0")
ToBin = StrReverse(binary)
End Function
Private Function Bin2Decimal(inBin)
Dim counter
Dim temp
Dim Value
inBin = StrReverse(inBin)
temp = 0
For counter = 1 to Len(inBin)
If counter = 1 then
Value = 1
Else
Value = Value * 2
End If
temp = temp + mid(inBin, counter ,1) * Value
Next
Bin2Decimal = temp
End Function
Public Function SWFDump(fileName)
header = ReadHeader (fileName)
mversion = asc(mid(header,4,1))
mfilelen = asc(mid(header,5,1))
mfilelen = mfilelen + asc(mid(header,6,1)) * 256
mfilelen = mfilelen + asc(mid(header,7,1)) * 256 * 256
mfilelen = mfilelen + asc(mid(header,8,1)) * 256 * 256 * 256
RECTdata = ToBin(asc(mid(header,9,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,10,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,11,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,12,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,13,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,14,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,15,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,16,1)),8)
RECTdata = RECTdata & ToBin(asc(mid(header,17,1)),8)
nBits = Mid(RECTdata,1,5)
nBits = Bin2Decimal(nBits)
mxMin = Bin2Decimal(Mid(RECTdata,6,nBits))
mxMax = Bin2Decimal(Mid(RECTdata,6 + nBits * 1 ,nBits))
myMin = Bin2Decimal(Mid(RECTdata,6 + nBits * 2 ,nBits))
myMax = Bin2Decimal(Mid(RECTdata,6 + nBits * 3 ,nBits))
mheigt = (myMax - myMin) / 20
mwidth = (mxMax - mxMin) / 20
mframerate = asc(mid(header,18,1))
mframecount = asc(mid(header,19,1))
mframecount = mframecount + asc(mid(header,20,1)) * 256
End Function
Public Property Get Heigt()
Heigt = mheigt
End Property
Public Property Get Width()
Width = mwidth
End Property
Public Property Get Version()
Version = mversion
End Property
Public Property Get FileLen()
FileLen = mfilelen
End Property
Public Property Get xMin()
xMin = mxMin
End Property
Public Property Get xMax()
xMax = mxMax
End Property
Public Property Get yMin()
yMin = myMin
End Property
Public Property Get yMax()
yMax = myMax
End Property
Public Property Get Framerate()
Framerate = mframerate
End Property
Public Property Get Framecount()
Framecount = mframecount
End Property
End Class
%>
Mendapatkan Informasi stored procedure
public DataSet GetMainSprocList()
MENGUBAH String dalam FORMAT $51,234.98 MENJADI 51234.98
Dalam VB Script :
Function StripNonNum(strInput)
Dim regEx
' Create a regular expression
Set regEx = New RegExp
' Match any character NOT in this list
regEx.Pattern = "[^0123456789\.]"
regEx.IgnoreCase = True
regEx.Global = True
' Replace matches with zero length string
StripNonNum = regEx.Replace(strInput, "")
End Function
' Returns: 51234.98
Response.Write StripNonNum("$51, 234.98")
Dalam JScript :
<%@language=JScript%>
<%
// Acts exactly the same as the VBScript version
function MakeNumber(strInput) {
var re = new RegExp('[^1234567890\.]', 'gi')
return(strInput.replace(re, ''));
}
// Returns 51234.98
Response.Write(MakeNumber('$51, 234.98'));
%>
Sebenarnya VBScript mempunyai built-in function yang dapat menyelesaikan permasalahan ini. Function ini bersifat “localized”, artinya bila kita menggunakannya di Amerika maka function ini akan mengenali tanda dollar sebagai symbol mata uang tapi di Jepang, function ini akan mengenali Yen sebagai mata uang.
Function CCur berarti “Convert Currency” dapat digunakan sebagai berikut :
Response.Write CCur("$51,234.98") ' will write 51234.98
Response.Write CCur("4.55555") ' will write 4.5556
Simbol mata uang diwakili secara internal oleh MS dengan 4 digit ke kanan dari decimal point. Salah satu cara untuk menggunakan CCur dan melakukan pengecekan terhadap error dapat dilihat pada source code berikut :
<%
val = "NOT VALID"
On Error Resume Next
val = CCur( Request("money") )
On Error Goto 0
Response.Write val
%>
Bila kita ingin menggunakan Deutsche Mark (mata uang Jerman), kita dapat menambahkan :
<%
Session.LCID = 1031
%>
Sekarang, $12,345.67 akan ditolak namun 123.456 DM akan diterima. Hal ini sangat berguna bagi site-site yang menangani berbagai symbol mata uang yang berbeda.
Mengisi dan Mengakses Clipboard
Menggunakan Clipboard di code C# anda adalah sangat mudah. Misal, anda ingin meletakkan isi text dari TextBox1 anda ke Clipboard anda cukup menulis:
Clipboard.SetDataObject(textBox1.Text);
Jika anda dapat mengisi Clipboard, anda tentu dapat mengambil data pada Clipboard. Kali ini, jika anda ingin mengambil data text dari Clipboard dan meletakkannya pada text TextBox1 anda, anda cukup menulis:
textBox1.Text = Clipboard.GetDataObject()
.GetData(DataFormats.Text).ToString();
Membuat RollOver Button Server Control
Pada kesempatan ini akan dibahas cara untuk membuat roll-over button
Dasar Pembuatan Roll-Over Button
Langkah pertama dalam membuat roll over button adalah menyiapkan 2 buah file grafik, satu untuk image default dan satu lagi bila button tersebut dilewati mouse.
Langkah berikutnya adalah membuat tag hyperlink () dengan image default sebagai content dari hypelink. Sebaiknya atribut name dari tag

Berikutnya kita tulis source code dari JavaScript client side. Object Image dari JavaScript akan menampung image yang digunakan. Hal ini akan memampukan kita untuk menukar image default dengan image roll over secara otomatis sehingga user tidak perlu mendownload image roll over yang sebenarnya ketika dia melewatkan mouse di atas button untuk pertama kali. Berikut source codenya :
Langkah selanjutnya adalah menulis function Java Script yang berguna untuk menukar image default dengan image roll over atau sebaliknya. Function ini akan kita beri nama function display() dan function ini akan memiliki 2 parameter. Parameter pertama menunjukkan nama dari image dari tag
Baris pertama (statement if) ) memastikan bahwa object image eksis. Alasan pengecekan ini adalah karena user mungkin hanya mendownload website secara sebagian saja ketika function ini dipanggil. Bila tidak dilakukan pengecekan untuk hal ini maka kemungkinan akan terjadi JavaScript error.
Setelah melewati pengecekan ini, property src dari tag
Langkah terakhir adalah menghubungkan function display() dengan mouse event entering dan leaving. Kita perlu menambahkan event onmouseover dan onmouseout pada tag . Event handler ini akan memanggil function display() dengan memasingkan parameter. Berikut source codenya :
onmouseover="display('home_img', home_img_over);"
onmouseout="display('home_img', home_img_out);"
>

How to Use a GDI+ Application in NetCOBOL for .NET
Untuk mencobanya, bisa dengan mendownload NetCOBOL untuk .NET software pada site berikut ini: http://www.netcobol.com/products/windows/netcobol.html#downloads.
Untuk memulai menggunakan GDI ini, diperlukan brush pen, beberapa jenis teksture untuk image, color, dan sebagainya. Secara teknisnya, dilakukan dengan menggunakan namespace System.Drawing. Kemudian, buat COBOL Project dan pilih Windows Application sebagai templatenya. Kita akan membuat sebuah tombol pada form tersebut dan setelah diklik, maka akan menampilkan message, dengan menggunakan namespace System.Drawing. Aksesoris yg diperlukan berasal dari kelas-kelas Graphics, Bitmap, TextureBrush, dan Font. Lalu, tambahkan semua code berikut ini ke dalam REPOSITORY:
CLASS CLASS-GRAPHICS AS "System.Drawing.Graphics"
CLASS CLASS-BITMAP AS "System.Drawing.Bitmap"
CLASS CLASS-TEXTUREBRUSH AS "System.Drawing.TextureBrush"
CLASS CLASS-FONT AS "System.Drawing.Font"
Dalam WORKING-STORAGE SECTION deklarasikan :
01 graphicsobj OBJECT REFERENCE CLASS-GRAPHICS.
01 brushobj OBJECT REFERENCE CLASS-TEXTUREBRUSH.
01 bmpobj OBJECT REFERENCE CLASS-BITMAP.
01 fontobj OBJECT REFERENCE CLASS-FONT.
01 strFileName OBJECT REFERENCE CLASS-STRING.
01 x1 COMP-1. 01 y1 COMP-1.
x1 dan y1 dideklarasikan sebagai COMP-1, yg mana ekuivalen dengan tipe data .NET single. Disini kita tidak memberikan sembarang nilai pada kedua variabel tersebut. Untuk itu, kita bisa menentukannya dengan :
01 x1 COMP-1 VALUE 7.
01 y1 COMP-1 VALUE 7.
Lalu, pada event click dari button, tulis :
INVOKE button1 "CreateGraphics" RETURNING graphicsobj.
SET strFileName TO "c:\bg.bmp".
INVOKE CLASS-BITMAP "NEW" USING BY VALUE strFileName RETURNING bmpobj.
INVOKE CLASS-TEXTUREBRUSH "NEW" USING BY VALUE bmpobj RETURNING brushobj.
INVOKE CLASS-FONT "NEW" USING BY VALUE "Verdana" 14 RETURNING fontobj.
SET strString TO "Cobol GDI+ Application".
INVOKE graphicsobj "DrawString" USING BY VALUE strString fontobj brushobj x1 y1.
Dalam kode tersebut, "Cobol GDI+ Application" ditampilkan dan teks ini mempunyai tekstur berupa bitmap image.
Membaca Tag MP3 ID3 Melalui Halaman ASP
<%
Function ConvertBin(Binary)
'This function converts a binary byte into an ASCII byte.
for i = 1 to LenB(Binary)
strChar = chr(AscB(MidB(Binary,i,1)))
ConvertBin = ConvertBin & strChar
Next
End Function
dim objStream
dim strTag, strSongName, strArtist, strAlbum, strYear, _
strComment, strGenre, strFile
'Specify the folder to iterate through, displaying all the MP3s
Const folder = "C:\mp3s\"
'Grab the folder information
'For more information on this technique below, check out this FAQ:
' http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=90
Dim objFSO, objFolder, objFile
Set objFSO = Server.CreateObject("Scripting.FileSYstemObject")
Set objFolder = objFSO.GetFolder(folder)
'Create the Stream object
set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = adTypeBinary
'Loop through the files in the folder
For Each objFile in objFolder.Files
'Open the stream
objStream.Open
objStream.LoadFromFile objFile.Path
'Read the last 128 bytes
objStream.Position = objStream.size - 128
'Read the ID3 v1 tag info
strTag = ConvertBin(objStream.Read(3))
if ucase(strTag) = "TAG" then
strSongName = ConvertBin(objStream.Read(30))
strArtist = ConvertBin(objStream.Read(30))
strAlbum = ConvertBin(objStream.Read(30))
strYear = ConvertBin(objStream.Read(4))
strComment = ConvertBin(objStream.Read(30))
end if
'Display the results
response.write "
" & _ | |
| " & objFile.Name & " | |
| Artist: | " & _" & strArtist & " |
| Track: | " & _" & strSongName & " |
| Album: | " & _" & strAlbum & " |
| Year: | " & _" & strYear & " |
| Comment: " & _ " | " & strComment & " |
objStream.Close
Response.Write "
"
Next
Set objStream = Nothing 'Clean up...
%>
Pembuatan Color Picker Pada ASP.Net
Pembuatan color picker seperti pada adobe. Sehingga jika kita membutuhkannya kita dapat mengimplementasikannya dengan mudah. Caranya adalah
Private Sub Paletta(ByVal TargetForm As String, _ ByVal PalettaRow As Long, _ ByVal Saturation As Long) Dim RGBColor As String Dim Gray As Double Dim lum As Double Dim sat As Double Dim hue As Double Dim row As HtmlTableRow Dim cell As HtmlTableCell Dim RBGcolor As String sat = Saturation / 100 For hue = 0 To 359 Step (360 / PalettaRow) row = New HtmlTableRow() For lum = 0.1 To 1 Step 0.02 cell = New HtmlTableCell() HlsToRgb(hue, lum, sat, RGBColor) cell.BgColor = RGBColor cell.Controls.Add(New HyperLink()) DirectCast(cell.Controls(0), HyperLink).Text = "_" DirectCast(cell.Controls(0), HyperLink).ForeColor = _ Color.FromArgb(Val("&h" & Mid(RGBColor, 1, 2)), _ Val("&h" & Mid(RGBColor, 3, 2)), _ Val("&h" & Mid(RGBColor, 5, 2))) DirectCast(cell.Controls(0), HyperLink).NavigateUrl = _ TargetForm & "?&C=" & RGBColor row.Cells.Add(cell) Next lum Table1.Rows.Add(row) Next hue row = New HtmlTableRow() For Gray = 0 To 255 Step 5.7 cell = New HtmlTableCell() cell.BgColor = Right("00" & Hex(Gray), 2) & _ Right("00" & Hex(Gray), 2) & Right("00" & Hex(Gray), 2) cell.Controls.Add(New HyperLink()) DirectCast(cell.Controls(0), HyperLink).Text = "_" DirectCast(cell.Controls(0), HyperLink).ForeColor = _ Color.FromArgb(Gray, Gray, Gray) DirectCast(cell.Controls(0), HyperLink).NavigateUrl = _ TargetForm & "?&C=" & Right("00" & Hex(Gray), 2) & _ Right("00" & Hex(Gray), 2) & Right("00" & Hex(Gray), 2) row.Cells.Add(cell) Next Gray Table1.Rows.Add(row) End Sub ' Converte HLS in RGB Private Sub HlsToRgb(ByVal H As Double, ByVal L As Double, _ ByVal S As Double, ByRef RGBColor As String) Dim p1 As Double Dim p2 As Double Dim r As Double Dim g As Double Dim b As Double If L = 0.5 Then p2 = L * (1 + S) Else p2 = L + S - L * S End If p1 = 2 * L - p2 If S = 0 Then r = Int(L * 255) g = Int(L * 255) b = Int(L * 255) Else r = Int(QqhToRgb(p1, p2, H + 120) * 255) g = Int(QqhToRgb(p1, p2, H) * 255) b = Int(QqhToRgb(p1, p2, H - 120) * 255) End If RGBColor = Right("00" & Hex(r), 2) & Right("00" & Hex(g), 2) & _ Right("00" & Hex(b), 2) End Sub
Merubah Komplek Password dalam ASP.NET V2.0
type="System.Web.Security.SqlMembershipProvider, System.Web,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
Konversi URL Menjadi Hyperlink
Function utama, InsertHyperlinks, didefiniskan sebagai berikut :
InsertHyperlinks(inText)
Function ini mengembalikan versi dari inText yang sudah dimodifikasi, mengganti seluruh URL dan alamat email dengan hyperlink. Berikut function secara keseluruhan :
'----------------------------------------------
' InsertHyperlinks(inText)
' Returns a inText with "URL"
' inserted where there is URL found.
'
' URL can start with "www" or "http"
' or
' URL can be a email address "*@*"
'----------------------------------------------
Function InsertHyperlinks(inText)
Dim objRegExp, strBuf
Dim objMatches, objMatch
Dim Value, ReplaceValue, iStart, iEnd
strBuf = ""
iStart = 1
iEnd = 1
Set objRegExp = New RegExp
objRegExp.Pattern = "\b(www|http|\S+@)\S+\b" ' Match URLs and emails
objRegExp.IgnoreCase = True ' Set case insensitivity.
objRegExp.Global = True ' Set global applicability.
Set objMatches = objRegExp.Execute(inText)
For Each objMatch in objMatches
iEnd = objMatch.FirstIndex
strBuf = strBuf & Mid(inText, iStart, iEnd-iStart+1)
If InStr(1, objMatch.Value, "@") Then
strBuf = strBuf & GetHref(objMatch.Value, "EMAIL", "_BLANK")
Else
strBuf = strBuf & GetHref(objMatch.Value, "WEB", "_BLANK")
End If
iStart = iEnd+objMatch.Length+1
Next
strBuf = strBuf & Mid(inText, iStart)
InsertHyperlinks = strBuf
End Function
Function GetHref(url, urlType, Target)
Dim strBuf
strBuf = " If UCase(urlType) = "WEB" Then
If LCase(Left(url, 3)) = "www" Then
strBuf = " Target & """>" & url & ""
Else
strBuf = " Target & """>" & url & ""
End If
ElseIf UCase(urlType) = "EMAIL" Then
strBuf = " Target & """>" & url & ""
End If
GetHref = strBuf
End Function
Menggunakan BaseValidator Untuk Mendapatkan control values
public class GetInputValue : BaseValidator
{
private string _controlValue;
public GetInputValue(string ControlID)
{
_controlValue = this.GetControlValidationValue(ControlID);
}
public ControlValue{
get
{
return _controlValue;
}
}
}
Pembuatan Library untuk implementasi RSS 2.0
private void Page_Load(object sender, System.EventArgs e)
{
IranianExperts.RSS.RSSChannel oRSSChannel =
new IranianExperts.RSS.RSSChannel("Channel Title",
"Channel Link", "Channel Description");
oRSSChannel.PubDate = System.DateTime.Now.ToString();
IranianExperts.RSS.RSSImage oRSSImage =
new IranianExperts.RSS.RSSImage(
"http://www.site.com/images/banner.gif",
"http://www.iranianexperts.com/", "Iranian Experts");
IranianExperts.RSS.RSSRoot oRSSRoot =
new IranianExperts.RSS.RSSRoot(oRSSChannel,
oRSSImage, Response.OutputStream);
IranianExperts.RSS.RSSItem oRSSItem = null;
oRSSItem =
new IranianExperts.RSS.RSSItem("Item 1", "http://www.item1.com/");
oRSSItem.PubDate = System.DateTime.Now.ToString();
oRSSRoot.Items.Add(oRSSItem);
oRSSRoot.Items.Add("Item 2");
oRSSRoot.Items.Add("Item 3", "http://www.item3.com/");
Response.Clear();
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "text/xml";
IranianExperts.RSS.RSSUtilities.PublishRSS(oRSSRoot);
Response.End();
}
Extending Security pada ASP.Net dengan menggunakan Roles dan HTTPmodules
Tetapi dengan cara ini saja masih kurang karena jika kitya masuk pada bagian sitemap ini maka tidak akan di restricted. Sehingga kita masih bisa merubahnya. Untuk menjaganya agar aman kita gunakan cara dibawah ini :
Menggunakan .Net Framework Data Provider untuk Oracle
Masalah yang timbul bila kita menggunakan data provider yang umum adalah data provider tersebut tidak dapat memaksimalkan performance untuk data store tertentu. Untuk mengatasi hal ini, Microsoft merelease data provider khusus untuk Microsoft SQL Server 7.0 dan di atasnya, bernama SqlClient. Dengan ini kita tidak perlu menggunakan driver OleDb.
Microsoft mengatakan bahwa performance dari provider baru ini melebihi performance provider lama sebesar 200%.
Oracle data provider men-support semua tipe data dari oracle 9i dan cursor dari store procedure Oracle yang mengembalikan result set. Sebagai catatan, Oracle 8i Release 3(8.1.7) Client atau di atasnya harus menginstal Web Server untuk provider ini.
Berikut adalah langkah-langkah untuk mengganti source code bila kita mempunyai ASP.NET code yang mengakses database Oracle :
1. Menginstal provider dari situs Microsoft
2. Menambahkan reference (System.Data.OracleClient.dll) pada Visual Studio .Net Project
3. Mengganti semua OleDbConnection, OleDbDataAdapter, OleDbCommand, OleDbDataReader, dan sebagainya dengan OracleConnection, OracleDataAdapter, OracleCommand, and OracleDataReader pada kode kita.
Kita juga perlu menambahkan Imports System.Data.OracleClient (atau System.Data.OracleClient, bila kita menggunakan C#) bila kita ingin menghindari full namespace
Sebuah contoh untuk mengkonversi provider OleDb menjadi provider Oracle dapat dilihat pada source code berikut :
Public Function myDataTable(ByVal SQL As String, ByVal ConnStr As String) As DataTable Dim cn As OleDbConnection
Dim dsTemp As DataSet
Dim dsCmd As OleDbDataAdapter
cn = New OleDbConnection(ConnStr)
cn.Open()
dsCmd = New OleDbDataAdapter(SQL, cn)
dsTemp = New DataSet()
dsCmd.Fill(dsTemp, "myQuery")
cn.Close()
Return dsTemp.Tables(0)
End Function
Kode di atas akan digantikan dengan….
Public Function myDataTable(ByVal SQL As String, ByVal ConnStr As String) As DataTable
Dim cn As OracleConnection
Dim dsTemp As DataSet
Dim dsCmd As OracleDataAdapter
cn = New OracleConnection(ConnStr)
cn.Open()
dsCmd = New OracleDataAdapter(SQL, cn)
dsTemp = New DataSet()
dsCmd.Fill(dsTemp, "myQuery")
cn.Close()
Return dsTemp.Tables(0)
End Function
Pembuatan DataForm Application seperti Windows Application pada ASP.Net dengan menggunakan ADO.NET
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Put user code to initialize the page here
' Passing the Data Panel to the navigator coz it'll not
' work from design mode properties (bug)
SqlDataNavigator1.ControlToNavigate = Me.SqlDataPanel1
' also passing the connection string from web.config
' becoz passing it from the design mode will not work (bug)
SqlDataPanel1.Connection = New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
'and finally passing it to the navigator too.
SqlDataNavigator1.Connection = Me.SqlDataPanel1.Connection
End Sub
'Handling the add record btn
Private Sub DataAddButton1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles DataAddButton1.Click
Dim insertStr As String = "insert into Employees" & _
" (LastName,FirstName,Title,City,Country,HomePhone,Notes) values('"_
+ Me.LastName_Txt.Text + "','" + Me.FirstName_Txt.Text + _
"','" + Me.Title_Txt.Text + "', '" + Me.City_Txt.Text + _
"','" + Me.Cntry_Txt.Text + "','" + Me.HomePhone_Txt.Text + _
"','" + Me.Notes_Txt.Text + "')"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(insertStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub
'Handling the delete btn
Private Sub Delete_Btn_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Delete_Btn.Click
Dim delStr As String = _
"delete from Employees where EmployeeID='" + _
Me.EmpID_Txt.Text + "'"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(delStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub
'Handling the update btn
Private Sub DataUpdateButton1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles DataUpdateButton1.Click
Dim updateStr As String = "update Employees set LastName='" + _
Me.LastName_Txt.Text + "',FirstName='" + _
Me.FirstName_Txt.Text + "',Title='" + _
Me.Title_Txt.Text + "',City='" + _
Me.City_Txt.Text + "',Country= '" + _
Me.Cntry_Txt.Text + "',HomePhone='" + _
Me.HomePhone_Txt.Text + "',Notes='" + _
Me.Notes_Txt.Text + "' where EmployeeID='" + _
Me.EmpID_Txt.Text + "'"
Dim conn As New _
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings(_
"ConnStr"))
Dim cmd As New SqlCommand(updateStr, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
Finally
conn.Close()
End Try
End Sub
Implementasi XML dan XPath dan recursive Script
Contoh Isi XML (daftar quiz dan jawabannya) :
untuk load XML nya caranya :
Sub Page_Load(src as Object, e as EventArgs)
'Load xml data
xDoc.Load(strXmlFilePath)
'Start a new quiz?
If Not Page.IsPostBack Then
'Yes! Count total question
intTotalQuestion = xDoc.SelectNodes("/quiz/mchoice").Count
'Record start time
ViewState("StartTime") = DateTime.Now
ShowQuestion(intQuestionNo)
End If
End Sub
setelah itu xml ini akan dimanfaatkan dengan menggunakan recursive script sehingga tidak boros halaman. Pemanfaatanya yaitu dengan memanggil halaman yang bersangkutan berulang kali.
Sub AnswerQuestion_Click(src as Object, e as EventArgs)
'Retrieve essential variables from state bag
intTotalQuestion = ViewState("TotalQuestion")
intQuestionNo = ViewState("QuestionNo")
intScore = ViewState("Score")
arrAnswerHistory = ViewState("AnswerHistory")
'Correct answer?
If rblAnswer.SelectedItem.Value = ViewState("CorrectAnswer") Then
intScore += 1
arrAnswerHistory.Add(0)
Else
arrAnswerHistory.Add(rblAnswer.SelectedItem.Value)
End If
'End of quiz?
If intQuestionNo=intTotalQuestion Then
'Yes! Show the result...
QuizScreen.Visible = False
ResultScreen.Visible = True
'Render result screen
ShowResult()
Else
'Not yet! Show another question...
QuizScreen.Visible = True
ResultScreen.Visible = False
intQuestionNo += 1
'Render next question
ShowQuestion(intQuestionNo)
End If
End Sub
Cara yang terakhit adalah pemanfaatan XPath. XPath adalah suatu cara dimana kita dapat mengakses xml dengan mudah. Karena xml adalah text sehingga kita harus melakukan text processing. Untuk lebih mudahnya kita dapat menggunakan xPath ini. Misalnya kita mau mendapatkan pilihan dari xml berikut
cara akses pada asp adalah :
Dim strXPath as String
strXPath = "/quiz/mchoice[" & intQuestionNo.ToString() & "]"
'Extract question
lblQuestion.Text = intQuestionNo.ToString() & ". " & xDoc.SelectSingleNode(strXPath & "/question").InnerXml
Maka dengan sangat mudah kita akan mendapatkan semua yang berhubungan mchoice dengan pada xml.
Brosing via Directory atau HTTP dengan ASP.Net
private void Page_Load(object sender, System.EventArgs e){ if(IsPostBack) DoAction();} private void DoAction(){ switch (_actionHidden.Value) { case "RefreshBrowse" : _browseButton_Click(this, null); break; case "OpenFile" : OpenFile(); break; } _actionHidden.Value = "";}
Fills the list box on a postback with my own HTML table:private void _browseButton_Click(object sender, System.Web.UI.ImageClickEventArgs e){ if (0 != _browseTextBox.Text.Length) { UpdateBrowseTextBoxWithSlash(); _browseTextBox.Text += _clickedObjectHidden.Value; _clickedObjectHidden.Value = ""; FileList fileList = new FileList(_browseTextBox.Text, "*.*"); Table tb = new Table(); TableRow tr; TableCell td; tb.Width = Unit.Percentage(100); tb.BorderWidth = 0; tb.CellSpacing = 0; tb.CellPadding = 4; foreach (string directory in fileList.Directories) { tr = new TableRow(); td = new TableCell(); td.Width = Unit.Percentage(100); td.CssClass = "nohilite"; System.Web.UI.WebControls.Image directoryImage = new System.Web.UI.WebControls.Image(); directoryImage.ImageUrl = "Images/folder.gif"; directoryImage.BorderWidth = 0; directoryImage.ImageAlign = ImageAlign.AbsMiddle; td.Attributes.Add("onDblClick", string.Format("DoBrowse(this, '{0}', true)", directory)); td.Attributes.Add("onClick", "HighLight(this, '')"); td.Controls.Add(directoryImage); td.Controls.Add(new LiteralControl(" " + directory + "")); tr.Cells.Add(td); tb.Rows.Add(tr); } foreach (string file in fileList.Files) { tr = new TableRow(); td = new TableCell(); td.Width = Unit.Percentage(100); td.CssClass = "nohilite"; td.Attributes.Add("onDblClick", string.Format("DoBrowse(this, '{0}', false)", file)); td.Attributes.Add("onClick", "HighLight(this, '')"); System.Web.UI.WebControls.Image fileImage = new System.Web.UI.WebControls.Image(); fileImage.ImageAlign = ImageAlign.AbsMiddle; fileImage.ImageUrl = "Images/file.gif"; td.Controls.Add(fileImage); td.Controls.Add(new LiteralControl(" " + file + "")); tr.Cells.Add(td); tb.Rows.Add(tr); } _browsePlaceholder.Controls.Add(tb); }}
Helper Class - FileList
Does all the actual work of getting the ArrayList of directories and files.protected void ParseHTTPPage ( string directory, string filter){ try { string[] filterlist = filter.Split(';'); if (!FileList.IsHTMLContent(directory)) directory = GetPath(directory); string uristring = ExtractUrifromUrl(directory); WebClient client = new WebClient(); byte[] pagedata = client.DownloadData(directory); string[] hrefs = ExtractHrefsFromPage(pagedata); ArrayList dirs = new ArrayList(); ArrayList files = new ArrayList(); foreach (string uri in hrefs) { if (uri.EndsWith("/")) { // handle the directory if (uri.StartsWith(uristring)) dirs.Add(uri.Substring(uristring.Length).Trim('/')); } else { string file = Path.GetFileName(uri); foreach (string query in filterlist) { if (System.Text.RegularExpressions.Regex.IsMatch(file, "." + query.Replace(".", "\\."), RegexOptions.IgnoreCase)) { files.Add(file); break; } } } } _directories = new string[dirs.Count]; dirs.CopyTo(_directories); System.Array.Sort(_directories); _files = new string[files.Count]; files.CopyTo(_files); System.Array.Sort(_files); _basedirectory = directory; if (!_basedirectory.EndsWith("/")) _basedirectory += "/"; } catch(Exception except) { System.Diagnostics.Trace.WriteLine("Exception" + " parsing URL: " + except.Message); } return;} protected void PasreUNCPage ( string directory, string filter){ try { if (FileAttributes.Directory != (FileAttributes.Directory & File.GetAttributes(directory))) directory = GetPath(directory); } catch(Exception) { return; } try { _directories = RelativePaths( Directory.GetDirectories(directory, "*.*")); System.Array.Sort(_directories); } catch(Exception except) { System.Diagnostics.Trace.WriteLine("Exception" + " parsing directory: " + except.Message); } try { _files = new string[0]; string[] extensions = filter.Split(';'); foreach (string ext in extensions) { string[] foundfiles = RelativePaths( Directory.GetFiles(directory, ext)); if (foundfiles.Length > 0) { string[] newlist = new string[_files.Length + foundfiles.Length]; _files.CopyTo(newlist, 0); foundfiles.CopyTo(newlist, _files.Length); _files = newlist; System.Array.Sort(_files); } } } catch(Exception except) { System.Diagnostics.Trace.WriteLine("Exception" + " parsing files: " + except.Message); } _basedirectory = directory; if (!_basedirectory.EndsWith("\\")) _basedirectory += "\\"; return;}
Online Quiz
Bisa juga dimasukkan tag-tag html, seperti
Australian native animals?]]>
Membuat instance dari XMLDocument
Dim xDoc as XMLDocument = New XMLDocument()
xDoc.Load(Server.MapPath("quiz.xml"))
Merubah XML dengan XSLT menjadi XHTML treeview
Contoh XML
sampletree.xml
contoh XSLT
treeview.xslt
1">


display:none;
selectLeaf('','')

Cara merubahannya adalah sebagai berikut :
sampletree.xml
treeview.xslt
1">


display:none;
selectLeaf('','')

Integrating Macromedia Flash MX and Microsoft ASP.NET
Flash versi 5 keatas, memiliki XML Object yang dapat meload dan mengirim XML. Dalam contoh berikut ini, akan memperhatikan bagaimana cara meload XML ke dalam Flash.
//instantiate a new XML Object
XMLDoc = new XML();
//call the load function, passing in the path to the XML to be loaded into Flash
XMLDoc.load("mydata.xml");
//setup the event handler for when the XML has been loaded into Flash
XMLDoc.onLoad = function(success) {
if (success) {
//XML is now successfully loaded and parsed and is ready to use
} else {
//XML was not loaded successfully and an error should be displayed
}
}
Letakkan tag < type="flash"> dan code > yang mengapit source code diatas.
Kemudian, jika ingin meload secara dinamik XML yg telah digenerate yg ada dalam file XML static. Contoh berikut ini akan meletakkan tabel Product dari database Northwind yg disediakan dalam Microsoft SQL Server.
Dalam contoh berikut, akan dapat dilihat cara cepat untuk membuat XMLDocument dari sebuah query pada tabel Product.
Private Function GetXML(ByVal SQLCom As SQLCommand, ByVal TableName As String) As XMLDocument
Dim Temp As New XmlDocument()
With SQLCom
.Connection.Open()
Dim i As Integer
Dim SQLData As SqlDataReader = .ExecuteReader
With SQLData
Temp.AppendChild(Temp.CreateElement(TableName))
While .Read
Temp.FirstChild.AppendChild(Temp.CreateElement("item"))
For i = 0 To .FieldCount - 1
Temp.FirstChild.LastChild.Attributes.Append(Temp.CreateAttribute(.GetName(i))).Value = .GetValue(i)
Next
End While
End With
.Connection.Close()
End With
Return Temp
End Function
Response.ContentType = "text/xml"
GetData(SQLProductsGet, "products").Save(Response.OutputStream)
Letakkan tag < type="flash"> dan < /code > yang mengapit source code diatas.
Function GetXML menggunakan sebuah paraeter SQLCommand, yang mana akan berisi CommandText dan Parameter yg diperlukan untuk mengembalikan result-set yg benar yg ingin kita ubah ke dalam bentuk XML.
Letakkan kode siatad ke dalam sebuah file ASPX. Jika menggunakan browser IE, maka bisa dengan mudah mengetes untuk melakukan verifikasi dimana kode tersebut bekerja dengan benar dengan membuka page http://localhost/myapp/GetData.aspx atau URL yg tepat/bersesuaian dengan halaman ASPX yg dibuat.
Satu hal yg perlu dilakukan untuk mendapatkan data ini menjadi data dalam Flash adalah dengan mengubah baris kode dalam Flash yg digunakan untuk meload XML, tujuannnya untuk menspesifikasikan dari URL mana data diload.
XMLDoc.load("GetData.aspx");
Untuk potongan kode diatas, juga tetap diapit dengan sepasang tag < type="Flash"> dan < /code >
Kita juga bisa mengubah file ASPX untuk mempassingkan dalam CategoryID melalui QueryString untuk memfilter result-set dengan Product Category. Bagian terbaik mengenai cara meloading XML menjadi Flash adalah bahwa sekali data diload, tidak ada lebih banyak round trips back ke server, tidak peduli bahwa data perlu untuk direfresh. Inisial hit mungkin tampak besar, tergantung pada banyak data, untuk men-dial-up user. Akan tetapi, kita bisa setup sesuuatu untuk hanya menampilkan sejumlah record dan halaman tertentu, yg secara absolute tidak memerlukan trips back ke server.
Disini tidak akan dijabarkan secara detail bagaimana menggunakan XML Object dalam Flash. tetapi contoh berikut ini menunjukkan bagaimana me-loop seluruh isi tabel Product yg ada.
for ( var i = 0; i <>{
trace("Product[" + (i + 1) + "].ProductID = " + XMLDoc.firstChild.childNodes[i].attributes.ProductID;
}
Thursday, June 09, 2005
PHP vs ASP.NET
Jika menggunakan ASP.NET tapi ingin menggunakan Apache untuk front-door ke Internet, maka Apache bisa menghubungkan request-request kita ke IIS yg berjalan secara internal pada mesin yg lain. Apache juga menangani static content dan passes aspx content pada IIS Server, yg mana tidak akan ditampilkan ke Internet.
Untuk berhubungan dengan database, pada ASP.NET terdapat sedikit kerumitan karena kita mempunyai pilihan sejumlah bahasa yg digunakan. Berikut ini adalah cara dalam ASP.NET untuk berhubungan dengan Oracle dengan menggunakan bahasa VB.NET :
Imports SystemImports System.DataImports System.Data.OracleClientImports Microsoft.VisualBasic
Class Sample
Public Shared Sub Main()
Dim oraConn As OracleConnection = New OracleConnection("Data Source=MyOracleServer;Integrated Security=yes;")
Dim oraCMD As OracleCommand = New OracleCommand("SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER", oraConn)
oraConn.Open()
Dim myReader As OracleDataReader = oraCMD.ExecuteReader()
Do While (myReader.Read())
Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1))
Loop
myReader.Close()
oraConn.Close()
End SubEnd Class
Dilihat dari segi kecepatan dan efisiensi, dengan ASP.NET kita bisa menjalankan lebih banyak kode melalui proses eksekusi terhadap halaman ASP yg sama dibanding mengeksekusi dengan menggunakan mesin PHP untuk sebuah halaman PHP yg ekuivalen.
Simple Chat Application
public class ChatUser : IDisposable
{ public string UserID; public string UserName; public bool IsActive; public DateTime LastSeen; public int LastMessageReceived; public ChatUser(string id,string userName) { this.UserID=id; this.IsActive=false; this.LastSeen=DateTime.MinValue ; this.UserName=userName; this.LastMessageReceived=0; } public void Dispose() { this.UserID=""; this.IsActive=false; this.LastSeen=DateTime.MinValue ; this.UserName=""; this.LastMessageReceived=0; }}
Class Message
public class Message
{ public string user; public string msg; public MsgType type;
public Message(string _user, string _msg, MsgType _type) { user = _user; msg = _msg; type = _type; } public override string ToString() { switch(this.type) { case MsgType.Msg: return this.user+" says: "+this.msg; case MsgType.Join : return this.user + " has joined the room"; case MsgType.Left : return this.user + " has left the room"; } return ""; }
public Message(string _user, MsgType _type) : this(_user, "", _type) { }
public Message(MsgType _type) : this("", "", _type) { }
}
public enum MsgType { Msg, Start, Join, Left }
Program utamanya
private void Page_Load(object sender, System.EventArgs e){ if (AMS.Web.RemoteScripting.InvokeMethod(this)) //if this is a callback function return return;
txtMsg.Attributes.Add("onkeypress", "return clickButton(event,'btn')"); if (!IsPostBack) { if (Request.QueryString["userid"]!=null && Request.QueryString["userid"]!="") { otherUser.Value=Request.QueryString["userid"]; ChatRoom room=ChatEngine.GetRoom(Session["UserName"].ToString() , Request.QueryString["userid"]); string s=room.JoinRoom(Session["UserName"].ToString(), Session["UserName"].ToString() ); txt.InnerText=s; string strScript="<>startTimer();< /script >"; this.RegisterClientScriptBlock("timerScript",strScript); } else { Response.Write("User id Missing"); } }}
//Chat.aspx, digunakan untuk mengirimkan pesan chat
function clickButton(e, buttonid)
{ var bt = document.getElementById(buttonid);
if (typeof bt == 'object')
{ // cek browser yang digunakan
if(navigator.appName.indexOf("Netscape")>(-1))
{ if (e.keyCode == 13)
{ bt.click(); return false; }
}
if (navigator.appName.indexOf("Microsoft Internet Explorer")>(-1))
{ if (event.keyCode == 13) { bt.click(); return false; } } } }
function button_clicked(){ RS.Execute("Chat.aspx", "SendMessage",document.Form1.txtMsg.value,document.Form1.otherUser.value, callback, errorCallback); document.Form1.txtMsg.value=""; document.Form1.txt.scrollIntoView("true");}
function callback(result){ document.Form1.txt.value=document.Form1.txt.value+result; document.Form1.txt.doScroll();}
function errorCallback(result){ alert("An error occurred while invoking the remote method: " + result);}
Dictionary untuk Saran Google seperti Dictionary
Langkah-langkahnya:
Langkah 1(Membuat Substrate):
Substrate adalah hasil HTML plain text conversion menjadi beberapa nilai (CSV)
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
progbar2.Value = 0
Dim myfile = New IO.StreamReader(txtpath2.Text)
Try
'---Proceesing the file that contain delimited contents
Dim Line As String
Line = myfile.Readtoend
'----Remove unwanted tags
Line = Line.Replace("<P>", "")
progbar2.Value += 1
Line = Line.Replace("</P>", "")
progbar2.Value += 1
Line = Line.Replace("<B>", "")
progbar2.Value += 1
Line = Line.Replace(" (<I></I>) ", "@")
progbar2.Value += 1
Line = Line.Replace("</B>", "@")
progbar2.Value += 1
Line = Line.Replace(" (<I>", "")
progbar2.Value += 1
Line = Line.Replace("</I>) ", "@")
progbar2.Value += 1
Dim myfileSave As New IO.StreamWriter(txtpathtarget.Text, True)
myfileSave.Write(Line)
myfileSave.Close()
progbar2.Value += 1
MessageBox.Show("Substrate completed successfully", _
"Dict Maker")
Catch ex As IO.IOException
MessageBox.Show("Error: " & ex.Message, "Critical error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Error: " & ex.Message, "Critical error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
myfile.Close()
End Try
End Sub
File akan digunakan pada langkah 2 untuk menghasilkan INSERT INTO statement.
Langkah 2:
Setelah kamu selesai mengubah HTML files menjadi CSV files, kamu akan generate dari CSV files INSERT INTO statement yang diperlukan. Pada langkah ini, kamu akan menspesifikasikan CSV file yang dibuat pada langkah 1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
ProgBar.Value = 0
If txtpath.Text = "" Then Exit Sub
MsgBox(txtpath.Text)
'-----Open the connection
Dim con As New OleDb.OleDbConnection
Dim com As New OleDb.OleDbCommand
'------
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=d:\vbprograms\dictmaker\dict.mdb"
'----calculate estimates and set the progress bar
ProgBar.Maximum = CalculateEstimate(txtpath.Text)
'----
Dim myfile = New IO.StreamReader(txtpath.Text)
Try
'--open the database
con.Open()
'---Proceesing the file that contain delimited contents
Dim Line As String
Dim AfterSep() As String
'--------------------Ignore the first 9 lines
For t As Integer = 1 To 9
myfile.ReadLine()
Next t
'--------------------
While myfile.Peek > -1
Application.DoEvents()
Line = myfile.ReadLine()
If Line = "</BODY>" Then Exit While
'----If the carriage return, request next line
If Line = "" Then Line = myfile.ReadLine()
AfterSep = Line.Split("@"c)
'----Build the command and executeit
com.Connection = con
com.CommandText = _
"INSERT INTO dict (word,type,mean) VALUES (?,?,?)"
com.Parameters.Clear()
com.Parameters.Add("?", AfterSep(0))
com.Parameters.Add("?", AfterSep(1))
com.Parameters.Add("?", AfterSep(2))
com.ExecuteNonQuery()
'----Set value progress
' If ProgBar.Value = 5136 Then Stop
ProgBar.Value += 1
lblprocessed.Text = "Line(s) processed : " & ProgBar.Value
End While
MessageBox.Show("Conversion completed successfully", "Dict Maker")
Catch ex As OleDb.OleDbException
MessageBox.Show("Error: " & ex.Message, _
"Critical error", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
Catch ex As IO.IOException
MessageBox.Show("Error: " & ex.Message, _
"Critical error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Error: " & ex.Message, _
"Critical error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
con.Close()
myfile.Close()
End Try
End Sub
Hitung baris yang akan diproses:
Function CalculateEstimate(ByVal path As String) As Integer
Dim estimate As New IO.StreamReader(path)
Dim NumOfLines As Integer
While estimate.Peek > -1
estimate.ReadLine()
NumOfLines += 1
End While
estimate.Close()
lblTotalLines.Text = "Total Line(s): " & NumOfLines - 11
Return NumOfLines
End Function
Bekerja dengan ASP.NET dan CRYSTAL REPORT 9 dengan atau tanpa RAS 9
Menampilkan Crystal Report dari RAS 9 pada format PDF dengan ASP.NET
Taruh parameter berikut pada appsettings web.config
ServerName - mesin di mana SQLmu berada, contoh: machine_sqlsvr2000_1.
DatabaseName - database name pada SQL Server, contoh: northwind.
RASServer - nama server yang mempunyai reports, contoh, machine_reportserver_9_1.
ReportPath - path pada RAS server dimana reports disimpan, contoh, c:\proects\project1\reports\.
UserID and Password - user name dan password for databasemu.
Kemudian,kamu perlu untuk menaruh method ini pada page ASP>NET yang akan digunakan untuk memanggil report
Public Sub CreateReport()
'************************** Mention Report Name *****************************
Dim m_RptName As String = "report1.rpt"
'****************************************************************************
Dim _db_server As String = ConfigurationSettings.AppSettings("ServerName")
Dim _db_name As String = ConfigurationSettings.AppSettings("DatabaseName")
Dim _ras_server As String = ConfigurationSettings.AppSettings("RASServer")
Dim _file_name As String = _
ConfigurationSettings.AppSettings("ReportPath") & m_RptName
Dim _user_id As String = ConfigurationSettings.AppSettings("UserID")
Dim _pwd As String = ConfigurationSettings.AppSettings("Password")
Dim oRptViewer As New RASReportViewer
Dim rcDoc As ReportClientDocument
rcDoc = New ReportClientDocument
rcDoc.ReportAppServer = _ras_server
rcDoc.Open(_file_name)
' logon using Logon helper function below
oRptViewer.Logon(rcDoc, _user_id, _pwd, _db_server, _db_name)
'****************** pass your parameters here *****************
' you will change this portion according
' to the parametrs that your report expects
' parameters
oRptViewer.PassParameter(rcDoc, "", 0, Session("CategoryString"))
oRptViewer.PassParameter(rcDoc, "", 1, Session("Terms"))
oRptViewer.PassParameter(rcDoc, "", 2, Session("Division"))
oRptViewer.PassParameter(rcDoc, "", 3, Session("Location"))
'**************************************************************
Dim byteArray As ByteArray = _
rcDoc.PrintOutputController.Export(_
CrReportExportFormatEnum.crReportExportFormatPDF)
Response.ClearContent()
Response.ClearHeaders()
Response.ContentType = "application/pdf"
Response.BinaryWrite(byteArray.DetachArray)
Response.Flush()
Response.Close()
oRptViewer.Dispose()
If Not oRptViewer Is Nothing Then
oRptViewer = Nothing
End If
End Sub
Kamu dapat membuat perubahan pada method di atas jika kamu ingin menampilkan report-mu pada format lain. Kamu harus merubah baris program di bawah ini:
Response.ClearContent()
Response.ClearHeaders()
Response.ContentType = "application/pdf"
Response.BinaryWrite(byteArray.DetachArray)
Response.Flush()
RASReportViewer Class
Ini adalah class yang dipanggil di atas:
Imports CrystalDecisions.ReportAppServer.ClientDoc
Imports CrystalDecisions.ReportAppServer.Controllers
Imports CrystalDecisions.ReportAppServer.DataDefModel
Imports CrystalDecisions.ReportAppServer.CommonObjectModel
Public Class RASReportViewer
Inherits System.ComponentModel.Component
' CR variables
Dim rcDoc As ReportClientDocument
Dim m_last_error As String
#Region " Component Designer generated code "
Public Sub New(ByVal Container As System.ComponentModel.IContainer)
MyClass.New()
'Required for Windows.Forms Class Composition Designer support
Container.Add(Me)
End Sub
Public Sub New()
MyBase.New()
'This call is required by the Component Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
' passes a parameter value to report
'
' PARAMETERS [in] doc RAS Report Client Document
' [in] report_name subreport name
' (pass empty string for main report)
' [in] param_name report parameter name
' [in] param_value report parmaeter value
Public Sub PassParameter( _
ByRef doc As ReportClientDocument, _
ByVal report_name As String, _
ByVal param_name As String, _
ByVal param_value As Object)
' create parameter discrete value
Dim param_val As New ParameterFieldDiscreteValue
' set parameter value
param_val.Value = param_value
' create parameter value collection
Dim vals As New Values
' add parameter value to this collection
vals.Add(param_val)
' set current value
doc.DataDefController.ParameterFieldController._
SetCurrentValues(report_name, param_name, vals)
End Sub
' identical to method above except this method
' takes index of the parameter instead of name
Public Sub PassParameter( _
ByVal doc As ReportClientDocument, _
ByVal report_name As String, _
ByVal param_index As Integer, _
ByVal param_value As Object)
PassParameter(doc, report_name, _
doc.DataDefinition.ParameterFields(param_index).Name, _
param_value)
End Sub
' Reusable ApplyLogon method. This method takes RAS database object,
' ConnectionInfo, and report name, and applies this connection info to
' all tables in the database. This method is used by Logon method below.
' Normally you do not have to call this
' method directly, but simply use Logon method.
'
' Parameters [in] doc RAS report client document
' [in] database RAS database (contains collecion of tables)
' [in] ci ConnectionInfo that contains SQL credentials
' [in] report_name subreport name (empty for main)
Private Function ApplyLogon( _
ByVal doc As ReportClientDocument, _
ByVal database As Database, _
ByVal ci As ConnectionInfo, _
ByVal report_name As String) As Boolean
' loop through each table in database tables collection
Dim table_old As _
CrystalDecisions.ReportAppServer.DataDefModel.Table
For Each table_old In database.Tables
' now create a new table object
Dim table_new As New _
CrystalDecisions.ReportAppServer.DataDefModel.Table
' set new table name
table_new.Name = table_old.Name
' set new connection info
table_new.ConnectionInfo = ci
' set qualified name. Connection Info object
' simply contains logon credentials
' that tells RAS how to connect to database.
' But this information is not sufficient
' for RAS to find the table/stored proc.
' For instance, in Northwind database, you
' can create two tables with same name as follows:
' Northwind.dbo.Customers
' Northwind.gabe.Customers
' The syntax is database.owner.table/stored proc.
' This information is saved
' in Table.QualifiedName property.
' If you are not changing database name or owner,
' then you can leave this property alone,
' but if you are changing them, you must
' set them. In another words, you created
' a reprot off Northwind.dbo.Customers, and
' wish to change this to Northwind2.dbo.Customers
' at runtime, you must set this
' QualifiedName property.
Dim qualified_name As String = table_old.QualifiedName
' now strip off database name from qualified name
qualified_name = _
qualified_name.Substring(qualified_name.IndexOf("."))
' at this point, qualified_name will look like .owner.table
' now add new database name.
' NOTE that we are assuming that
' this new database name is in ConnectionInfo
' property.
qualified_name = CType(ci.Attributes("QE_LogonProperties"), _
PropertyBag)("Initial Catalog").ToString() + qualified_name
table_new.QualifiedName = qualified_name
' now apply the changes
Try
If (report_name.Length > 0) Then
' this is a subreport
doc.SubreportController.SetTableLocation(report_name,_
table_old, table_new)
Else
' this is a main report
doc.DatabaseController.SetTableLocation(table_old,_
table_new)
End If
Catch x As Exception
m_last_error = x.Message
Return (False)
End Try
Next
Return (True)
End Function
' Reusable Logon method. This method takes RAS report client document, and
' SQL logon credentials. This sample is designed for Microsoft SQL Server
' using SQL authentication. You will need to change this code a little to
' make it to work with ODBC DSN or other data source
'
' PARAMETERS [in] doc RAS report client document
' [in] uid database user id
' [in] pass database password
' [in] server database server name
' [in] database database (catalog) name
Public Function Logon( _
ByVal doc As ReportClientDocument, _
ByVal uid As String, _
ByVal pass As String, _
ByVal server As String, _
ByVal database As String) As Boolean
' grab existing connection information from main report, and clone it
Dim ci As ConnectionInfo = _
doc.DatabaseController.GetConnectionInfos(Nothing)(0).Clone(True)
' set new user id and password
ci.UserName = uid
ci.Password = pass
' grab logon properties bag (this property
' bag contains your server and database name)
Dim li As PropertyBag = ci.Attributes("QE_LogonProperties")
' set new server name; note that we are
' setting "Data Source" property. if you are
' using ODBC DSN, you must set "DSN" property and pass your DSN name here.
li("Data Source") = server
' set database (catalog) name; note that
' we are setting "Initial Catalog" property.
' if you are using ODBC DSN, you must set
' "Database" property and pass your database
' name here.
li("Initial Catalog") = database
' optionally you can set other properties here.
' for instance, if you created a report
' using Integrated Security, and wish
' to pass SQL logon credentials (because RAS
' service cannot impersonate), you can set
' this property to false as follows:
' li["Integrated Security"] = false;
' now our 'new' connection info object
' is ready to be passed to the report
' pass this connection info to all tables in the main report
' NOTE: main report has empty report name
If (Not ApplyLogon(doc, doc.Database, ci, "")) Then
Return (False)
End If
' now loop through each subreport and pass this connection info
Dim sub_name As String
For Each sub_name In doc.SubreportController.QuerySubreportNames()
If (Not ApplyLogon(doc, _
doc.SubreportController.GetSubreportDatabase(sub_name), _
ci, sub_name)) Then
Return (False)
End If
Next
Return (True)
End Function
'Component overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Component Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Component Designer
'It can be modified using the Component Designer.
'Do not modify it using the code editor.
Private Sub InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
End Class
2.Class untuk menampilkan Crystal Reports 9 report pada format PDF tanpa RAS
Kamu harus setup parameter di bawah ini pada web.config file :
ReportPath - path dari report yang ingin ditampilkan;
ServerName , DatabaseName, UserID and Password - connection string.
Argument:
sReport -nama report;
arParams - parameter yang diharapkan oleh report;
DoParams - False jika report tidak mempunyai parameter.
Here is the class
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.Web.Design
Imports System.IO
Public Class ShowCRInPDF
Public Sub CreateReport(ByVal sReport As String, ByVal _
arParams As Array, Optional ByVal _
DoParams As Boolean = True)
Dim oRpt As New ReportDocument
Dim oSubRpt As New ReportDocument
Dim Counter As Integer
Dim crSections As Sections
Dim crSection As Section
Dim crReportObjects As ReportObjects
Dim crReportObject As ReportObject
Dim crSubreportObject As SubreportObject
Dim crDatabase As Database
Dim crTables As Tables
Dim crTable As Table
Dim crLogOnInfo As TableLogOnInfo
Dim crConnInfo As New ConnectionInfo
Dim crParameterValues As ParameterValues
Dim crParameterDiscreteValue As ParameterDiscreteValue
Dim crParameterRangeValue As ParameterRangeValue
Dim crParameterFieldDefinitions As ParameterFieldDefinitions
Dim crParameterFieldDefinition As ParameterFieldDefinition
Dim crParameterFieldDefinition2 As ParameterFieldDefinition
Dim strFile As String
Dim fi As FileInfo
Dim tstr As String
Dim sPath As String
Dim configurationAppSettings As _
System.Configuration.AppSettingsReader = _
New System.Configuration.AppSettingsReader
Dim sReportPath As String = _
configurationAppSettings.GetValue("ReportPath", _
GetType(System.String)) & sReport
Dim pos As Integer
'Try
tstr = Microsoft.VisualBasic.Format(Now, "MM/dd/yyyy HH:mm:ss")
'load report
oRpt.Load(sReportPath)
'log on to SQL server
'Report code starts here
'Set the database and the tables objects to the main report 'oRpt'
crDatabase = oRpt.Database
crTables = crDatabase.Tables
'Loop through each table and set the connection info
'Pess the connection info to the logoninfo object then apply the
'logoninfo to the main report
For Each crTable In crTables
With crConnInfo
.ServerName = _
configurationAppSettings.GetValue("ServerName", _
GetType(System.String))
.DatabaseName = _
configurationAppSettings.GetValue("DatabaseName", _
GetType(System.String))
.UserID = _
configurationAppSettings.GetValue("UserID", _
GetType(System.String))
.Password = _
configurationAppSettings.GetValue("Password", _
GetType(System.String))
End With
crLogOnInfo = crTable.LogOnInfo
crLogOnInfo.ConnectionInfo = crConnInfo
crTable.ApplyLogOnInfo(crLogOnInfo)
Next
'Set the sections collection with report sections
crSections = oRpt.ReportDefinition.Sections
'Loop through each section and find all the report objects
'Loop through all the report objects
'to find all subreport objects, then set the
'logoninfo to the subreport
For Each crSection In crSections
crReportObjects = crSection.ReportObjects
For Each crReportObject In crReportObjects
If crReportObject.Kind = ReportObjectKind.SubreportObject Then
'If you find a subreport, typecast
'the reportobject to a subreport object
crSubreportObject = CType(crReportObject, SubreportObject)
'Open the subreport
oSubRpt = _
crSubreportObject.OpenSubreport(_
crSubreportObject.SubreportName)
crDatabase = oSubRpt.Database
crTables = crDatabase.Tables
'Loop through each table and set the connection info
'Pess the connection info
'to the logoninfo object then apply the
'logoninfo to the subreport
For Each crTable In crTables
With crConnInfo
.ServerName = _
configurationAppSettings.GetValue("ServerName", _
GetType(System.String))
.UserID = _
configurationAppSettings.GetValue("UserID", _
GetType(System.String))
.Password = _
configurationAppSettings.GetValue("Password", _
GetType(System.String))
End With
crLogOnInfo = crTable.LogOnInfo
crLogOnInfo.ConnectionInfo = crConnInfo
crTable.ApplyLogOnInfo(crLogOnInfo)
Next
End If
Next
Next
' Set the parameters
If DoParams Then
'Get the collection of parameters from the report
crParameterFieldDefinitions = oRpt.DataDefinition.ParameterFields()
For Counter = 0 To UBound(arParams)
crParameterFieldDefinition = _
crParameterFieldDefinitions.Item(Counter)
' Response.Write(crParameterFieldDefinition.ParameterFieldName_
' & "
")
'Get the current values from the parameter field.
crParameterValues = crParameterFieldDefinition.CurrentValues
If Not IsArray(arParams(Counter)) Then
'Test if param passed in matches CR param recieving
Dim test As String
Dim paramcounter As Integer
For paramcounter = 0 To UBound(arParams)
' Response.Write(arParams(paramcounter))
test = arParams(paramcounter)
'Grabs param from CR and compares against param passed in
If test.StartsWith(_
crParameterFieldDefinition.ParameterFieldName()) Then
'arParams(Counter) = _
' test.Substring(test.IndexOf("=") + 1)
'Set the current values for the parameter field 0
crParameterDiscreteValue = New ParameterDiscreteValue
crParameterDiscreteValue.Value = _
test.Substring(test.IndexOf("=") + 1)
'Add the first current value for the parameter field
crParameterValues.Add(crParameterDiscreteValue)
'Response.Write(crParameterFieldDefinition.
' ParameterFieldName() & "- " & _
' crParameterDiscreteValue.Value)
'Response.Flush()
Exit For
End If
Next
Else
crParameterRangeValue = New ParameterRangeValue
crParameterRangeValue.StartValue = arParams(Counter)(0)
crParameterRangeValue.EndValue = arParams(Counter)(1)
crParameterValues.Add(crParameterRangeValue)
End If
'All current parameter values
'must be applied for the parameter field.
crParameterFieldDefinition.ApplyCurrentValues(crParameterValues)
Next
End If
Dim s As System.IO.MemoryStream = _
oRpt.ExportToStream(ExportFormatType.PortableDocFormat)
' the code below will create pdfs
' in memory and stream them to the browser
' instead of creating files on disk.
With HttpContext.Current.Response
.ClearContent()
.ClearHeaders()
.ContentType = "application/pdf"
.AddHeader("Content-Disposition", "inline; filename=Report.pdf")
.BinaryWrite(s.ToArray)
.End()
End With
'Catch ex As System.Exception
'Finally
' Erase arParams
'End Try
End Sub
End Class
Localizable Currency TextBox
Webcontrol secara default, merender sebagai span. Untuk render sebuah textbox , harus override Tagkey
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Input;
}
}
dan kemudian tambahkan atribut dengan overriding AddAttributesToRender.
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
// Tambahkan atribut untuk menampilkan sebuah text control
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
writer.AddStyleAttribute("text-align", Alignment.ToString());
// Tambahkan atribut yang ditentukan user untuk control format warna
writer.AddAttribute("negativeColor", NegativeColor.Name);
if (PositiveColor != Color.Empty)
{
writer.AddAttribute("positiveColor", PositiveColor.Name);
}
// Tambahkan client side event handlers
writer.AddAttribute("onkeypress", "EnsureNumeric()");
writer.AddAttribute("onfocus", "FormatAsDecimal(this)");
writer.AddAttribute("onblur", "FormatAsCurrency(this)");
}
Dua atribut yang ditentukan user ditambahkan pada rendered control,positiveColor dan negativeColor. Dua atribut ini dibaca pada script dari sisi client untuk mengatur warna text tergantung dari nilainya.
Script Client Side
Base class method OnPreRender dioverride untuk mendapatkan format number. Kemudian itu akan mengecek jika script sudahb diregister atau belum.Jika belum, code akan dipanggil untuk membangun mereka menggunakan NumberFormat dan akhirnya akan me-registerkan mereka
protected override void OnPreRender(EventArgs e)
{
// Get the number format of the current culture
NumberFormatInfo format = Thread.CurrentThread.CurrentCulture.NumberFormat;
// Register the EnsureNumeric script
if (!Page.IsClientScriptBlockRegistered("EnsureNumeric"))
{
Page.RegisterClientScriptBlock("EnsureNumeric",EnsureNumericScript(format));
}
...........
Lima function script yang diregister:
EnsureNumeric() ditunjukkan pada event OnKeyPress and membatasi entry keyboard pada valid input.
FormatAsDecimal() is ditunjukkan pada event OnFocus. Ini memanggil CurrencyToDecimal() function and mem-format teksnya berdasarkan nilai kembaliannya.
FormatAsCurrency() ditunjukkan pada event OnBlur . Ini memanggil DecimalToCurrency() function and mem-format teksnya berdasarkan nilai kembaliannya.
CurrencyToDecimal() mengubah string currency menjadi nilai desimal
DecimalToCurrency() mengubah nilai desimal menjadi string currency .
Code yang digunakan untuk menghasilkan script ini terlalu panjang maka di sini diajarkan langkah-langkah untuk membuat Currency TextBox
Create Vertikal Label in ASP.Net
contoh output:
P G
N i
G f
Listing yang digunakan untuk mengubah label:
using System;
using System.Globalization;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WebImageTest {
public class VerticalText : System.Web.UI.Page {
private Color StrToColor(string c) {
if (c.Trim().IndexOf("$")==0) return ColorTranslator.FromHtml(c.Replace("$","#"));
else return Color.FromName(c);
}
private void Page_Load(object sender, System.EventArgs e) {
string Text = Request["Text"];
string fontName = "Arial";
int fontSize = 12;
FontStyle fontStyle = new FontStyle();
try {
string [] fontStr = Request["Font"].Split(new char[] {'|',',',' ','/',':',';'});
try { if (fontStr[0]!="") fontName = fontStr[0]; } catch { }
try { fontSize = int.Parse(fontStr[1]); } catch { }
try {
if (fontStr[2].IndexOf('B')>=0) fontStyle |= FontStyle.Bold;
if (fontStr[2].IndexOf('I')>=0) fontStyle |= FontStyle.Italic;
if (fontStr[2].IndexOf('U')>=0) fontStyle |= FontStyle.Underline;
} catch {}
} catch {}
Font font = new Font(fontName, fontSize, fontStyle);
int pad = 0;
Color bgColor = Color.White;
Brush br = Brushes.Black;
try { pad = int.Parse(Request["Padding"]); } catch { }
try { bgColor = StrToColor(Request["BgColor"]); } catch { }
try { br = new SolidBrush( StrToColor(Request["FrColor"]) ); } catch { }
StringFormat format = new StringFormat(StringFormat.GenericDefault);
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.DirectionVertical;
SizeF sz = (Graphics.FromImage(new Bitmap(1,1))).MeasureString(Text, font, Point.Empty, format);
Bitmap bm = new Bitmap((int)sz.Width+2*pad,(int)sz.Height+2*pad);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bm);
try {
g.Clear(bgColor);
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; //AntiAliasGridFit;
g.TranslateTransform ((int)sz.Width,(int)sz.Height);
g.RotateTransform(180.0F);
g.DrawString(Text, font, br, -1-pad, 1-pad, format);
MemoryStream ms = new MemoryStream();
bm.Save(ms,ImageFormat.Png);
Response.ContentType = "image/png";
Response.BinaryWrite( ms.ToArray() );
ms.Close();
} finally {
g.Dispose();
bm.Dispose();
font.Dispose();
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Listing yang digunakan untuk mengubah text :
using System;
using System.Web.UI;
using System.Text;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
namespace TH.WebControls {
[DefaultProperty("Text"),
ToolboxData("<{0}:VerticalLabel runat=server>")]
public class VerticalLabel : WebControl, INamingContainer {
private string text;
[Bindable(true),
Category("Appearance"),
DefaultValue("Text to be verticaly rendered.")]
public string Text {
get { return text; }
set { text = value; }
}
private int _Padding;
[Category("Appearance"),]
public int Padding {
get { return _Padding; }
set {
_Padding = value;
}
}
///
The HTML writer to write out to
protected override void Render(HtmlTextWriter output) {
output.Write(" s.Append("&Font="+Font.Name+"|");
if (Font.Size.Unit.Value>0)
s.Append(Font.Size.Unit.Value.ToString());
if (Font.Bold || Font.Italic || Font.Underline) {
s.Append("|");
if (Font.Bold ) s.Append("B");
if (Font.Italic ) s.Append("I");
if (Font.Underline) s.Append("U");
}
if (!BackColor.IsEmpty)
s.Append("&BgColor="+((BackColor.IsKnownColor)
?(new WebColorConverter()).ConvertToString(BackColor)
:ColorTranslator.ToHtml(BackColor).Replace("#","$")));
if (!ForeColor.IsEmpty)
s.Append("&FrColor="+((ForeColor.IsKnownColor)
?(new WebColorConverter()).ConvertToString(ForeColor)
:ColorTranslator.ToHtml(ForeColor).Replace("#","$")));
if (Padding>0)
s.Append("&Padding="+Padding.ToString());
s.Append("\"");
output.Write(s.ToString());
output.Write(" Alt=\""+Text+"\">");
}
}
}
Mengubah XML ke SQL
using System;
using System.Windows.Forms;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace DefaultNamespace
{
public class MainForm : System.Windows.Forms.Form
{
private System.Windows.Forms.MenuItem enregistrer;
private System.Windows.Forms.RichTextBox affichage;
private System.Windows.Forms.MenuItem quitter;
private System.Windows.Forms.MenuItem menuItem7;
private System.Windows.Forms.MenuItem ouvrir;
private System.Windows.Forms.DataGrid Grille;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.DataGrid xml;
private System.Windows.Forms.MenuItem menuItem6;
private System.Windows.Forms.MenuItem menuItem5;
private System.Windows.Forms.RichTextBox requete;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem aide;
private System.Windows.Forms.ComboBox ChoixBase;
private System.Windows.Forms.MenuItem sql;
private System.Windows.Forms.MenuItem menuItem10;
// deklarasi variabel
private SqlConnection MaSqlCnx = new SqlConnection();
private OpenFileDialog MaBoite = new OpenFileDialog();
private DataSet unDS = new DataSet();
private string sCreate = "";
private SqlCommand MySqlCmd = new SqlCommand();
private SaveFileDialog MaSauvegarde = new SaveFileDialog();
private StreamWriter sEcrire;
private DataSet dsXml = new DataSet();
private DataTable DatTableSource = null;
private SqlDataAdapter da = null;
private DataSet ds = new DataSet();
public MainForm()
{
InitializeComponent();
}
[STAThread]
public static void Main(string[] args)
{
Application.Run(new MainForm());
}
#region Windows Forms Designer generated code
private void InitializeComponent() {
this.menuItem10 = new System.Windows.Forms.MenuItem();
this.sql = new System.Windows.Forms.MenuItem();
this.ChoixBase = new System.Windows.Forms.ComboBox();
this.aide = new System.Windows.Forms.MenuItem();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.requete = new System.Windows.Forms.RichTextBox();
this.menuItem5 = new System.Windows.Forms.MenuItem();
this.menuItem6 = new System.Windows.Forms.MenuItem();
this.xml = new System.Windows.Forms.DataGrid();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.Grille = new System.Windows.Forms.DataGrid();
this.ouvrir = new System.Windows.Forms.MenuItem();
this.menuItem7 = new System.Windows.Forms.MenuItem();
this.quitter = new System.Windows.Forms.MenuItem();
this.affichage = new System.Windows.Forms.RichTextBox();
this.enregistrer = new System.Windows.Forms.MenuItem();
((System.ComponentModel.ISupportInitialize)(this.xml)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.Grille)).BeginInit();
this.SuspendLayout();
//
// item menu
//
this.menuItem10.Index = 2;
this.menuItem10.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.aide});
this.menuItem10.Text = "?";
//
// SQL
//
this.sql.Index = 1;
this.sql.Text = "SQL";
this.sql.Click += new System.EventHandler(this.SQL);
this.ChoixBase.Location = new System.Drawing.Point(8, 24);
this.ChoixBase.Name = "ChoixBase";
this.ChoixBase.Size = new System.Drawing.Size(152, 21);
this.ChoixBase.TabIndex = 3;
this.ChoixBase.Text = "-----Selection----";
this.aide.Index = 0;
this.aide.Text = "A propos";
this.aide.Click += new System.EventHandler(this.Aide);
//
// mainMenu
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1,
this.menuItem5,
this.menuItem10});
this.requete.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.requete.Location = new System.Drawing.Point(568, 56);
this.requete.Name = "requete";
this.requete.Size = new System.Drawing.Size(452, 136);
this.requete.TabIndex = 1;
this.requete.Text = "";
this.menuItem5.Index = 1;
this.menuItem5.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem6,
this.menuItem2});
this.menuItem5.Text = "Affichage";
this.menuItem6.Index = 0;
this.menuItem6.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem7,
this.sql});
this.menuItem6.Text = "Afficher";
// XML
//
this.xml.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.xml.CaptionForeColor = System.Drawing.SystemColors.ActiveCaptionText;
this.xml.DataMember = "";
this.xml.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.xml.Location = new System.Drawing.Point(568, 208);
this.xml.Name = "xml";
this.xml.Size = new System.Drawing.Size(452, 208);
this.xml.TabIndex = 2;
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.ouvrir,
this.enregistrer,
this.quitter});
this.menuItem1.Text = "Fichiers";
this.menuItem2.Index = 1;
this.menuItem2.Text = "Requette";
this.menuItem2.Click += new System.EventHandler(this.Requette);
this.Grille.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.Grille.CaptionForeColor = System.Drawing.SystemColors.ActiveCaptionText;
this.Grille.DataMember = "";
this.Grille.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.Grille.Location = new System.Drawing.Point(568, 432);
this.Grille.Name = "Grille";
this.Grille.Size = new System.Drawing.Size(452, 184);
this.Grille.TabIndex = 4;
this.ouvrir.Index = 0;
this.ouvrir.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.ouvrir.Text = "Ouvrir";
this.ouvrir.Click += new System.EventHandler(this.Ouvrir);
this.menuItem7.Index = 0;
this.menuItem7.Text = "XML";
this.menuItem7.Click += new System.EventHandler(this.XML);
this.quitter.Index = 2;
this.quitter.Shortcut = System.Windows.Forms.Shortcut.AltF4;
this.quitter.Text = "Quitter";
this.quitter.Click += new System.EventHandler(this.Quitter);
this.affichage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.affichage.Location = new System.Drawing.Point(8, 56);
this.affichage.Name = "affichage";
this.affichage.Size = new System.Drawing.Size(544, 560);
this.affichage.TabIndex = 0;
this.affichage.Text = "";
this.enregistrer.Index = 1;
this.enregistrer.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
this.enregistrer.Text = "Enregistrer";
this.enregistrer.Click += new System.EventHandler(this.Enregistrer);
//
// MainForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(1028, 621);
this.Controls.Add(this.Grille);
this.Controls.Add(this.ChoixBase);
this.Controls.Add(this.xml);
this.Controls.Add(this.requete);
this.Controls.Add(this.affichage);
this.Menu = this.mainMenu1;
this.Name = "MainForm";
this.Text = "MainForm";
this.Load += new System.EventHandler(this.MainFormLoad);
((System.ComponentModel.ISupportInitialize)(this.xml)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.Grille)).EndInit();
this.ResumeLayout(false);
}
#endregion
private void Quitter( object sender, System.EventArgs e)
{
this.Close(); }
private void Ouvrir( object sender, System.EventArgs e)
{
MaBoite.Filter = "";
// inisialisasi
xml.Text = "";
requete.Text = "";
MaBoite.Filter= "XML (*.xml)|*.xml| tous (*.*)|*.*";
// deklarasi tipe variabel
MaBoite.FilterIndex = 0;
MaBoite.RestoreDirectory = true;
MaBoite.ShowDialog();
if (MaBoite.FileName != "")
{
try
{
unDS.ReadXml(MaBoite.FileName); }
catch (System.Exception ex) {
//jika gagal diterima / tidak valid
MessageBox.Show (ex.Message);
string MsgErreur = Convert.ToString(ex);
int idebut = MsgErreur.IndexOf("(")+1;
int ifin = MsgErreur.IndexOf(")");
int iTaille = ifin - idebut;
string sChaine = MsgErreur.Substring(idebut,iTaille);
string sChaineFerme = ""+sChaine+">";
sChaine = "<"+sChaine+">";
StreamReader unSR = new StreamReader(MaBoite.FileName);
string sTest = unSR.ReaDatTableoEnd();
unSR.Close();
int iEJdepart=sTest.IndexOf(sChaine);
int iEJarrive=sTest.IndexOf(sChaineFerme);
int iEJdepart2=sTest.LastIndexOf(sChaine);
int iEJarrive2=sTest.LastIndexOf(sChaineFerme);
while(iEJdepart!=iEJdepart2)
{
string sDebut = sTest.Substring(0,iEJdepart2);
string sFin = sTest.Substring(iEJarrive2+sChaineFerme.Length);
sTest = sDebut+sFin;
iEJdepart2 = sTest.LastIndexOf(sChaine);
iEJarrive2 = sTest.LastIndexOf(sChaineFerme);
}
sTest = sTest.Replace("encoding="+'\u0022'+"UTF-16"+'\u0022',"");
xml.Text = sTest;
StreamWriter sw = new StreamWriter(MaBoite.FileName);
sw.WriteLine(sTest);
sw.Close();
}
StreamReader SR = new StreamReader(MaBoite.FileName); affichage.Text = unDS.GetXml(); }
}
private void Enregistrer( object sender, System.EventArgs e)
{
if(requete.Text =="")
{
MessageBox.Show("Il n'y a rien à sauvegarder !!");
}
else
{
MaSauvegarde.Filter= "texte (*.txt) |*.txt|tous (*.*) |*.*";
MaSauvegarde.FilterIndex = 0;
MaSauvegarde.RestoreDirectory = true;
MaSauvegarde.ShowDialog();
if(MaSauvegarde.FileName != "")
{
try {
sEcrire = new StreamWriter(MaSauvegarde.FileName, true);
sEcrire.WriteLine(requete.Text);
sEcrire.Close();
}
catch(System.Exception ex)
{
MessageBox.Show(ex.Message); }
}
}
}
private void XML( object sender, System.EventArgs e)
{
if(MaBoite.FileName!= "")
{
string filePath =MaBoite.FileName;
try
{
dsXml.ReadXml(filePath);
xml.DataSource = dsXml;
}
catch(System.Exception ex)
{
MessageBox.Show (ex.Message);
string MsgErreur = Convert.ToString(ex);
int idebut = MsgErreur.IndexOf("(")+1;
int ifin = MsgErreur.IndexOf(")");
int iTaille = ifin - idebut;
string sChaine = MsgErreur.Substring(idebut,iTaille);
string sChaineFerme = ""+sChaine+">";
sChaine = "<"+sChaine+">";
StreamReader unSR = new StreamReader(MaBoite.FileName);
string sTest = unSR.ReaDatTableoEnd();
unSR.Close();
int iEJdepart=sTest.IndexOf(sChaine);
int iEJarrive=sTest.IndexOf(sChaineFerme);
int iEJdepart2=sTest.LastIndexOf(sChaine);
int iEJarrive2=sTest.LastIndexOf(sChaineFerme);
while(iEJdepart!=iEJdepart2)
{
string sDebut = sTest.Substring(0,iEJdepart2);
string sFin = sTest.Substring(iEJarrive2+sChaineFerme.Length);
sTest = sDebut+sFin;
iEJdepart2 = sTest.LastIndexOf(sChaine);
iEJarrive2 = sTest.LastIndexOf(sChaineFerme);
}
sTest = sTest.Replace("encoding="+'\u0022'+"UTF-16"+'\u0022',"");
xml.Text = sTest;
StreamWriter sw = new StreamWriter(MaBoite.FileName);
sw.WriteLine(sTest);
sw.Close(); }
}
}
private void SQL( object sender, System.EventArgs e)
{
requete.Text = ""; sCreate = "";
foreach(DataTable DATTABLE in unDS.Tables) {
sCreate = " CREATE TABLE " + DATTABLE.TableName + " ("; foreach(DataColumn DC in DATTABLE.Columns) {
int iLong = 0; iLong = DC.ColumnName.Length;
if (DC.ColumnName.Substring(0,(iLong-3)) == "_ID") {
if(DC.ColumnName.Substring(0,(iLong-3)) == DATTABLE.TableName) {
DC.ColumnName += " " + DC.DataType + " PRIMARY KEY "; }
else
{
DC.ColumnName += " "+DC.DataType+ " CONSTRAINT " + "FK_" + DC.ColumnName.Substring(0,(iLong-3)) + "_" + DATTABLE.TableName + " FOREIGN KEY REFERENCE " + DC.ColumnName.Substring(0,(iLong-3)) + " (" + DC.ColumnName;
}
}
else
{
DC.ColumnName += " " + DC.DataType; }
sCreate += DC.ColumnName + ","; }
int iTailleInsert = sCreate.Length;
sCreate = sCreate.Substring(0,(iTailleInsert-1)); sCreate += ") \n";
}
foreach(DataTable DATTABLE in unDS.Tables) {
for(int j=0;j <= DATTABLE.Rows.Count;j++) {
sCreate += " INSERT INTO " + DATTABLE.TableName + " VALUES ( ";
for(int i=0;i<=DATTABLE.Columns.Count;i++) {
string srow = Convert.ToString(unDS.Tables[DATTABLE.TableName].Rows[j][i]); srow = srow.Replace("'","''");
sCreate += "'" + srow + "'" + ","; }
int iTaille = sCreate.Length;
sCreate = sCreate.Substring(0,(iTaille-1)); sCreate += ") \n";
}
}
sCreate = sCreate.Replace("System.String","varchar(255)"); sCreate = sCreate.Replace("System.Int32","int");
requete.Text = sCreate; }
private void Aide(object sender, System.EventArgs e)
{
MessageBox.Show("Génerateur de code SQL");
}
private void Requette(object sender, System.EventArgs e)
{
try{
Grille.DataSource = null;
DatTableSource = null;
da = null;
if(requete.Text != "")
{
da = new SqlDataAdapter(requete.Text, MaSqlCnx);
MaSqlCnx.ConnectionString = "Integrated security = SSPI ; server = CLEM_PORTABLE ; database =" + ChoixBase.SelectedItem.ToString();
//MaSqlCnx.ConnectionString = "server = votre_serveur; user id = sa ;password = pwd"; database =" + ChoixBase.SelectedItem.ToString(); MaSqlCnx.Open();
//membuat koneksi MySqlCmd.Connection = MaSqlCnx;
da.Fill(ds,"toto"); DatTableSource = ds.Tables[0];
Grille.DataSource = DatTableSource; }
}
catch(System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
MaSqlCnx.Close(); }
}
private void MainFormLoad(object sender, System.EventArgs e)
{
//MaSqlCnx.ConnectionString = "server = votre_serveur; user id = sa ;password = pwd"; // koneksi ke database
MaSqlCnx.ConnectionString = "Integrated security = SSPI ; server = CLEM_PORTABLE";
try //untuk mencoba apakah koneksi berhasil dilakukan
{
MaSqlCnx.Open(); MySqlCmd.Connection = MaSqlCnx;
MySqlCmd.CommanDatTableext = "SELECT NAME FROM SYSDATABASES ORDER BY name ASC" ;
SqlDataReader monSqlDR = MySqlCmd.ExecuteReader();
while(monSqlDR.Read())
{
ChoixBase.Items.Add(monSqlDR.GetValue(0).ToString()) ; }
MaSqlCnx.Close();
}
catch(System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
Kirim SMS Melalui Web Service
Contoh tampilan yang ada :
(radiio buton) SMS to India sms to world
Email ID :
Country Code :
Mobile/Cellnumber :
Message:
button SEND
Listing :
Listing Program :
private void Send_Click(object sender, System.EventArgs e)
{
try
{
SmsTest.net.webservicex.www.SendSMS smsIndia=
new SmsTest.net.webservicex.www.SendSMS();
SmsTest.com.webservicex.www.SendSMSWorld smsWorld =
new SmsTest.com.webservicex.www.SendSMSWorld();
if(rdoType.SelectedValue == "1")
smsIndia.SendSMSToIndia(txtMobileNo.Text.Trim(),
txtEmailId.Text.Trim(), txtMessage.Text);
else
smsWorld.sendSMS(txtEmailId.Text.Trim(),
txtCountryCode.Text.Trim(),
txtMobileNo.Text.Trim(), txtMessage.Text);
lblMessage.Visible = true;
lblMessage.Text="Message Send Succesfully";
}
catch(Exception ex)
{
lblMessage.Visible = true;
lblMessage.Text="Error in Sending message"+ex.ToString();
}
}
private void rdoType_SelectedIndexChanged(object sender, System.EventArgs e)
{
if(rdoType.SelectedValue =="1")
txtCountryCode.Enabled = false;
else
txtCountryCode.Enabled = false;
}
Menangani Posisi Scroll pada Postback
Untuk dapat menangani atau mempertahankan posisi scroll pada saat post back, maka kita perlu melakukan hal-hal sebagai berikut:
1. Ketika posisi scroll berubah, maka kita perlu merekam posisi scroll pada input field hidden "< input >"
2. Ketika Web Form di post back, maka field-field "<input>" hidden ini akan dikirim kembali ke web server beserta field-field form yang lain. Pada program server kita, kita perlu mengirim kode kepada klien untuk menentukan posisi scroll.
Melalui mekanisme seperti yang telah dijelaskan, maka kita dapat mempertahankan posisi scroll pada saat post back. Untuk dapat melakukan hal ini, kita perlu memperhatikan beberapa hal :
1. Bagaimana kita dapat menentukan posisi scroll browser melalui program pada client.
2. Bagaimana program pada server kita dapat mengambil nilai scroll lama dan menghasilkan kode yang dapat mereset posisi scroll pada client.
Berikut ini adalah program javascript yang digunakan untuk menangani posisi scroll pada klien
<script language = "javascript">
<!--
function sstchur_SmartScroller_GetCoords()
{
var scrollX, scrollY;
if (document.all)
{
if (!document.documentElement.scrollLeft)
scrollX = document.body.scrollLeft;
else
scrollX = document.documentElement.scrollLeft;
if (!document.documentElement.scrollTop)
scrollY = document.body.scrollTop;
else
scrollY = document.documentElement.scrollTop;
}
else
{
scrollX = window.pageXOffset;
scrollY = window.pageYOffset;
}
document.forms[formID].xCoordHolder.value = scrollX;
document.forms[formID].yCoordHolder.value = scrollY;
}
function sstchur_SmartScroller_Scroll()
{
var x = document.forms[formID].xCoordHolder.value;
var y = document.formsformID].yCoordHolder.value;
window.scrollTo(x, y);
}
window.onload = sstchur_SmartScroller_Scroll;
window.onscroll = sstchur_SmartScroller_GetCoords;
window.onkeypress = sstchur_SmartScroller_GetCoords;
window.onclick = sstchur_SmartScroller_GetCoords;
// -->
<script>
Fungsi sstchur_SmartScroller_GetCoords() digunakan untuk mendapatkan posisi scroll saat ini (horisontal maupun
vertikal). Jika nilai dari scroll ini telah kita dapatkan, maka nilai dari posisi ini akan kita simpan melalui
tag hidden <input>
Fungsi sstchur_SmartScroller_Scroll() digunakan untuk mereset nilai posisi scroll pada saat page diload oleh
klien
Enumeration
yang telah ditentukan sebelumnya.
Berikut ini adalah syntax yang dapat digunakan untuk menghasilkan enumeration
' -- VB.NET
Public Enum EnumName [As Type]
Carriage-return delimited list of Named Constants
End Enum
// -- C#
public enum EnumName [: Type]
{
Comma-delimited list of Named Constants
}
sedangkan contoh penggunaan syntax diatas adalah sebagai berikut
' -- VB.NET
Public Enum MenuItemType
Header
Item
AlternatingItem
End Enum
// -- C#
public enum MenuItemType
{
Header,
Item,
AlternatingItem
}
Kumpulan Combobox yang Terhubung Secara Dinamis
Saya mencoba untuk memecahkan permasalahan ini dengan menggunakan Custom control
pada asp.Net.
Cara Kerja:
Source dari control server terletak pada loccontrol.cs. Kedua fungsi untuk mengisi combobox dengan menggunakan
data provider sql atau oleDB terkandung pada file ini. Adalah perlu untuk menambahkan atribut sqlserver=true pada
tag kar, jika tidak maka control akan menggunkan ole DB.
Aliran kerja dari program adalah sebagai berikut:
1. Custom control akan memulai kerjanya dengan membaca source dari loccontrol.cs dan menghasilkan code HTML yang
akan dikiim pada client dan akan mengisi combobox pertama.
2. User memilih item pada combo yang telah diisi pada client, client akan menjalankan onchange script untuk
kemudian mengisi combo berikutnya pada hiddenfrm.aspx dan mengirimkannya
3. Program server pada hiddenfrm.aspx.cs akan mengisi combo berikutnya
4. Program client pada hiddenfrmonload() akan mengisi combo pada container page dimana combobox sudah dipilih.
User akan melanjutkan memilih pada combobox berikutnya dan proses akan kembali pada langkah 2.
potongan program dari LocControl :
public class LocControl: System.Web.UI.Control
{
...
...
public string SqlServer // if this attribute value = true then
// custom will use SQL Data Provider;
// otherwise, OLE DB Provider
{
get{ return bSqlServer;}
set{ bSqlServer= value;}
}
public string ComboData
// String separated by ";" for each combobox.Between ";" write
// data needed for fill OPTION elements of SELECT tag
// separated by space ' '.
//
// For First element: will be three parameters
// First parameter: Table name from assigned in ConString
// data source
// Second paramente: Field name of Table that will be text
// value of combobox
// Third parameter: Field name of Table that wi be the value
// for combobox item and will use for seek in following
// combobox
// For Follwing comboboxes will be four parameters:
// First three parameters have same meaning that was for
// First combobox.
// Fourth parameter point out the key field in the Table where
// you select data for this combobox.
{
get { return CDates;}
set {CDates = value;}
}
public string ConString // set connection string for
// the appropriate provider
{
get{ return scon;}
set{ scon = value;}
}
public string Captions //comboboxes captions
{
get{ return sCaptions;}
set{ sCaptions = value;}
}
protected override void Render(HtmlTextWriter writer)
// fill custom control HTML code on page
//
{
string htextname = "";
//check ComboData attribute for empty
if(CDates == null)
return;
ArrayComboDates = CDates.Split(';'); // separate ComboData
// attribute's data
int comboquantity = ArrayComboDates.Length;
// hidden textbox to save ComboData attribute of control
writer.WriteBeginTag("input");
...
// hidden textbox to save connection string
writer.WriteBeginTag("input");
writer.WriteAttribute("type","hidden");
string hconnection = UniqueID+"_sconn";
writer.WriteAttribute("name",hconnection);
if(bSqlServer == "true")
writer.WriteAttribute("value", scon
+ "??" + "true");
else
writer.WriteAttribute("value",scon );
writer.Write(HtmlTextWriter.TagRightChar);
// begin <table tag to arrange control's elements
writer.WriteBeginTag("table");
...
// print captions for each combobox
writer.WriteFullBeginTag("tr");
writer.WriteLine();
if(sCaptions !=null)
capsarray = sCaptions.Split(';');
...
// print SELECT tags for each combobox
writer.WriteFullBeginTag("tr");
string[] ctrlname = new string[comboquantity];
for(int i=0; i < comboquantity; i++)
{
//begin td
writer.WriteBeginTag("td");
writer.WriteAttribute("align","center");
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteLine();
writer.WriteBeginTag("select");
ctrlname[i] = string.Format("{0}_{1}",this.UniqueID,i+1);
writer.WriteAttribute("name", ctrlname[i]);
if(i != (comboquantity - 1))
writer.Write("OnChange=\"OnChange(this.options
[this.selectedIndex].value,
this.name,this.form.name," +
comboquantity.ToString() + "," + htextname
+ "," + hconnection + ")\"");
if(ID!=null)
writer.WriteAttribute("id",this.ClientID);
writer.Write(HtmlTextWriter.TagRightChar);
// fill up first combobox
if(i == 0)
if(bSqlServer == "true")
FillClCombo(i,writer); // fill up by SQL
// provider
else
FillClCombo_uni(i,writer); // fill up by OLE DB
// provider
writer.Write("</select>");
writer.WriteEndTag("td");
writer.WriteLine();
}
writer.WriteEndTag("tr");
writer.Write("</Table>");
}
ketika user memilih item pada combo, maka data yang bersesuaian akan ditransfer dari hidden frame
(hiddenfrm.aspx) oleh function onchange() pada file subscript.js berikut
void function OnChange(combovalue,name,frmname,comboquantity,htext,
hconnection)
{
// get general base of combobox names using active combobox name
var baseofname = name.substr(0,name.lastIndexOf("_") + 1);
var number = name.substr(name.lastIndexOf("_")+1,name.length);
var intnumber = parseInt(number) + 1;
var nextcomboname;
//clean up subsequent comboboxes
for( i=intnumber; i < comboquantity; i++)
{
var n = i+1;
nextcomboname = baseofname + n
eval("document." + frmname + "." + nextcomboname +
".length = 0;");
}
//passing data from active page to Hidden form(HiddenFrm.aspx)
eval("var cfrm = document." + frmname);
eval("parent.bottomFrame.document.HiddenFrm.combotext.value=" +
combovalue);
parent.bottomFrame.document.HiddenFrm.comboname.value=frmname +
"." + name;
parent.bottomFrame.document.HiddenFrm.TextCDatas.value =
htext.value;
parent.bottomFrame.document.HiddenFrm.TextConnection.value =
hconnection.value;
parent.bottomFrame.document.HiddenFrm.submit();
}
kembali ke bagian server, bagian hiddenfrm.aspx.cs akan berisi
namespace HiddenFrm_ns
{
public class HiddenFrm : System.Web.UI.Page
{
...
...
private void Page_Load(object sender, System.EventArgs e)
{
string apppath =Context.Request.ApplicationPath;
//register script block
string scrsrc = "<script src=" + apppath +
"/KarControl/script.js></script>";
if(!IsClientScriptBlockRegistered("cSrcript"))
RegisterClientScriptBlock("cScript", scrsrc);
Response.Write("<br>");
// Get filled from active page data and fill up the
// intermediate combo
NameValueCollection fnv = Request.Form;
if(fnv.Count !=0)
{
string[] condata = (Request.Form.GetValues(
"TextConnection")[0]).Split('?');
con = condata[0];
string combotext = fnv.GetValues("combotext")[0];
//key value for filter data from next table in
//database
string comboname = (fnv.GetValues("comboname"))[0];
//name of combo that initiate submit in active page
//get name of next combo
char[] d = {'_'};
int ind = comboname.LastIndexOfAny(d);
string cnum = comboname.Substring(ind+1,
comboname.Length -(ind + 1));
int icombonum =(int)Convert.ChangeType(cnum,
ind.GetType());
icombonum = icombonum + 1;
string ctrlname = comboname.Substring(0,ind+1);
string nextcombo = ctrlname + icombonum.ToString();
// if after connection string is ; and "true" word this
// is SqlServer mode
if(condata.Length == 3 && condata[1] == "" &&
condata[2]=="true")
FillComboSql(combotext,icombonum); // fill combo (SQL Provider)
else
FillComboUni(combotext,icombonum); // fill combo (OleDB)
this.comboname.Text = nextcombo;
}
}
...
...
}
}
Nilai function HiddenFrmOnLoad merupakan data dari page pada file subscript.js
//send filled up combobox.s data from HiddenFrm.aspx to your
//active page
void function HiddenFrmOnLoad()
{
var op;
var text;
if(document.HiddenFrm.comboname.value != "")
{
text = "var mcombo = parent.mainFrame.document." +
HiddenFrm.comboname.value;
eval(text);
mcombo.options[0]= new Option("","");
for(i=0; i < document.HiddenFrm.hcombo.length; i++)
{
op = document.HiddenFrm.hcombo.options[i];
mcombo.options[i+1] = new Option(op.text,op.value);
}
mcombo.length = document.HiddenFrm.hcombo.length + 1;
}
}
Wednesday, June 08, 2005
Membuat Template Control
Dengan control ini dapat menambahkan template dan memilih bagaiman data akan ditampilkan, control ini terdiri dari dua class : DateTimeControl adalah control yang ditambahkan ke page, sedangkan DateTimeContanter adalah control yang menyimpan template data. Jika tidak menginginkan property yang dapat diuba-ubah, maka tidak memerlukan container.
Class utama DateTimeControl:
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Namespace AspNetCookbook
<ToolboxData("<{0}:DateTimeControl _
runat=server></{0}:DateTimeControl>"), _
ParseChildren(True)> _
Public Class DateTimeControl
Inherits Control
Implements INamingContainer
Private _template As ITemplate
Private _container As DateTimeContainer
Private _text As String
<TemplateContainer(GetType(DateTimeContainer))> _
Public Overridable Property Template() As ITemplate
Get
Return _template
End Get
Set(ByVal Value As ITemplate)
_template = Value
End Set
End Property
Public Overridable ReadOnly Property Container() As DateTimeContainer
Get
Return _container
End Get
End Property
Public Overridable Property Text() As String
Get
Return _text
End Get
Set(ByVal Value As String)
_text = Value
End Set
End Property
Public Overridable ReadOnly Property DateTime() As String
Get
Return System.DateTime.Now.ToShortTimeString()
End Get
End Property
Protected Overrides Sub OnDataBinding(ByVal e As EventArgs)
EnsureChildControls()
MyBase.OnDataBinding(e)
End Sub 'OnDataBinding
Protected Overrides Sub CreateChildControls()
If Not (Template Is Nothing) Then
_container = New DateTimeContainer(Text, DateTime)
Template.InstantiateIn(Container)
Controls.Add(Container)
Else
Controls.Add(New LiteralControl("" + [Text] + " " + DateTime))
End If
End Sub
End Class
Berikutnya ada container control DateTimeContainer
<%# Container.Text %>
Public Class DateTimeContainer
Inherits Control
Implements INamingContainer
Private _text As String
Private _dateTime As String
Public Sub New(ByVal text As String, ByVal dateTime As String)
Me._text = text
Me._dateTime = dateTime
End Sub 'New
Public ReadOnly Property Text() As String
Get
Return _text
End Get
End Property
Public ReadOnly Property DateTime() As String
Get
Return _dateTime
End Get
End Property
End Class
End Namespace
Contoh Extend Web Control yang sudah ada - Pada Label
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Public Class RainbowLabel
Inherits System.Web.UI.WebControls.Label
Public Property EnableRainbowMode() As Boolean
Get
If ViewState("EnableRainbowMode") Is Nothing Then
Return True
Else
Return Boolean.Parse(CStr(ViewState("EnableRainbowMode")))
End If
End Get
Set(ByVal Value As Boolean)
ViewState("EnableRainbowMode") = Value
End Set
End Property
Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
If EnableRainbowMode Then
output.Write(ColorizeString([Text]))
Else
output.Write([Text])
End If
End Sub 'Render
Private Function ColorizeString(ByVal input As String) As String
Dim output As New System.Text.StringBuilder(input.Length)
Dim rand As Random = New Random(DateTime.Now.Millisecond)
Dim i As Integer
For i = 0 To input.Length - 1
Dim red As Integer = rand.Next(0, 255)
Dim green As Integer = rand.Next(0, 255)
Dim blue As Integer = rand.Next(0, 255)
output.Append(" output.Append(Convert.ToString(red, 16))
output.Append(Convert.ToString(green, 16))
output.Append(Convert.ToString(blue, 16))
output.Append(""">")
output.Append(input.Substring(i, 1))
output.Append("")
Next i
Return output.ToString()
End Function
End Class
Cara menggunakannya adalah:
<%@ Page language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="AspNetCookbook" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>03 Custom Controls - 02 Extending Existing Web Controls</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<AspNetCookbook:RainbowLabel
text="This is a rainbow colored test string"
runat="server"/><br />
<AspNetCookbook:RainbowLabel EnableRainbowMode="false"
text="This is a test string" runat="server"/>
</form>
</body>
</html>
Control ini memberikan warna pelangi pada Label, warna untuk setiap karakter dirandom. Meskipun control ini tidak terlalu berguna, tetapi ini mendemonstrasikan bahwa kita dapat mengembangkan fungsi control yang sudah ada.
WebClient dan RegEx, dua class yang dapat digunakan untuk Screen Scraping (ambil sales rank Amazon)
Screen Scraping dapat dilakukan dengan mengambil bagian spesifik dari sebuah halaman(bukan seluruh halaman) dengan dua class yang dapat digunakan bersama-sama yaitu class WebClient dan RegEx.
Sebagai contoh adalah membuat service yang mengambil data sales rank (tingkat penjualan) dari web site Amazon.com. Nomor ISBN akan dipassingkan dan kemudian akan diperoleh tingkat penjualan untuk buku dengan ISBN yang dipassingkan.
Tahap pertama adalah membuat struktur dasar untuk Web Service dan methodnya
SalesRank.asmx
<%@ WebService Language="VB" Class="SalesRank" %>
Imports System.Net
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Web.Services
<WebService(Namespace:="http://www.graymad.com/webservices/")> _
Public Class SalesRank
Inherits WebService
<WebMethod()> _
Public Function GetSalesRankAmazon(Isbn As String) As Integer
' implementasi
End Function
End Class
Implementasinya :
<WebMethod()> _
Public Function GetSalesRankAmazon(Isbn As String) As Integer
Dim WC as New WebClient()
Dim strUrl As String
Dim strHTML As String
Dim strRegEx As String
strUrl = "http://www.amazon.com/exec/obidos/ASIN/" & Isbn & "/"
strRegEx = "Rank:"
Dim UTF8 as New UTF8Encoding()
strHTML = UTF8.GetString(WC.DownloadData(strUrl))
Dim r As Regex = New Regex(strRegEx, RegexOptions.IgnoreCase Or _
RegexOptions.Compiled)
Dim m As Match = r.Match(strHTML)
Dim MatchLoc As Integer
Dim RankBegin As Integer
Dim RankEnd As Integer
MatchLoc = m.Index
RankBegin = strHTML.IndexOf(">", MatchLoc) + 1
RankEnd = strHTML.IndexOf("<", RankBegin)
Return CInt(strHTML.Substring(RankBegin, RankEnd - RankBegin))
End Function
strUrl adalah URL yang akan diambil datanya, strHTML adalah HTML dari halaman yang di-scrape dan strRegEx adalah teks untuk class RegEx.
Kemudian digunakan instance dari class UTFEncoding untuk data yang diambil dari class WebClient, selanjutnya diambil fullHTML dari halaman target dengan memanggil method GetString dari UTFEncoding sebagai hasil dari method DownloadData dari instance WebClient.
Setelah memperoleh HTMLnya, kita berganti ke mode regular expression. Pertama buat instance dari class RegEx, kemudian instance dari class Match.Lalu kita mengambil lokasi dari permulaan teks sasaran, dan menggunakannya untuk mencari posisi dari HTML terakhir sebelum sales rank. Nilai ini digunakan untuk mencari lokasi dari tag HTML perama setelah data sales rank. Kita menggunakan RankBegin dan RankEnd untuk mengambil string yang merepresentasikan data sales rank, mengubahnya menjadi integer, dan mengembalikan nialinya.
Program di atas yang disimpan ke file dengan ekstensi .asmx, kemudian compile hingga menjadi salesrank.dll dan panggil dengan menggunakan kode:
Dim SR As New SalesRank
'Literal control digunakan untuk menampilkan sales rank
SalesRank.Text = "Amazon.com Sales Rank: " & SR.GetSalesRankAmazon("0735612870").ToString()
Sebagai fasilitas tambahan kita dapat menyediakan textbox atau metode lain untuk user sehingga dapat menginputkan ISBN untuk look up secara dinamis
Menyembunyikan Tombol pada ASP.NET dengan menggunakan OnClick JavaScript
Anda tentu telah melihat banyak message pada halaman checkout ecommerce : “Please click only once to avoid duplicate charges”, yaitu click sekali saja agar tidak dikenakan biaya 2 kali.
Untuk menangani hal ini, gantilah tombol asp.net dengan tombol HTML biasa tetapi pastikan berjalan pada server, bukan pada client.
Caranya:
Masukkan potongan program di bawah pada head
<style type="text/css">
.HIDDEN { VISIBILITY: hidden }
.VISIBLE { VISIBILITY: visible }
</style>
Kemudian gunakan DIV untuk pesan tunggu
<DIV class=HIDDEN id=WaitID style="FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Tahoma">Please stay with us, your request is being processed ........</div>
Contoh tombol HTML yang dijalankan pada server
<INPUT id=ConfirmAction style="VISIBILITY: visible" onclick=ConfirmAction_ServerClick(); type=button value=Confirm name=confirmation runat="server">
Pada HTML di atas digunakan CSS untuk menyembunyikan pesan tunggu dan menampilkan tombol sebagai default, kemudian tambahkan program JavaScript setelah tag < form >
<script language="javascript">
function ConfirmAction_ServerClick()
{
document.Form1.ConfirmAction.style.visibility="hidden";
WaitID.className="VISIBLE";
}
</script>
Kemudian dapat dituliskan program, sebagai contoh, redirect ke someaction.aspx yang tidak melakukan apapun.
private void ConfirmAction_ServerClick(object sender, System.EventArgs e)
{
Response.Redirect("someaction.aspx");
}
Membuat GuestBook dari XML
Dim strFilePath As String
Sub Page_Load(Src As Object, E As EventArgs)
'Path to the XML data
strFilePath = Server.MapPath("guestbook.xml")
If Not Page.IsPostBack Then
'If XML file not exists, create a new one
If Not File.Exists(strFilePath) Then
InitializeXMLFile()
End If
PopulateDataSet()
DisplayData()
end If
End Sub
Sub InitializeXMLFile()
'Create a new dataset
myDataSet = New DataSet()
'Create a new datatable
Dim myTable As DataTable = myDataSet.Tables.Add("myguestbook")
'Define column id
Dim myDataColumn as DataColumn = myTable.Columns.Add("id", Type.GetType("System.Int32"))
With myDataColumn
.AutoIncrement = true
.AutoIncrementSeed = 1
.AutoIncrementStep = 1
End With
'Set column id as the primary key
Dim arrPrimaryKey(1) As DataColumn
arrPrimaryKey(0) = myDataColumn
myTable.PrimaryKey = arrPrimaryKey
'Define the other columns
myTable.Columns.Add("datetime", Type.GetType("System.DateTime"))
myTable.Columns.Add("author", Type.GetType("System.String"))
myTable.Columns.Add("subject", Type.GetType("System.String"))
myTable.Columns.Add("comments", Type.GetType("System.String"))
'Write table structure to XML
myDataSet.WriteXml(strFilePath, XMLWriteMode.WriteSchema)
End Sub
Sub PopulateDataSet()
myDataSet = New DataSet()
myDataSet.ReadXml(strFilePath, XmlReadMode.ReadSchema)
End Sub
Sub DisplayData()
'Bind data to Repeater
Dim myDataView As DataView = myDataSet.Tables(0).DefaultView
'Uncomment next line to display the newer messages first
myDataView.Sort = "id DESC"
myRepeater.DataSource = myDataView
myRepeater.DataBind()
End Sub
Sub btnSubmit_Click(src as Object, e as EventArgs)
PopulateDataSet()
'Add new entry to DataSet
Dim myDataRow As DataRow = myDataSet.Tables(0).NewRow()
myDataRow("datetime") = DateTime.Now()
myDataRow("author") = txtAuthor.Text.toString()
myDataRow("subject") = txtSubject.Text.toString()
myDataRow("comments") = txtComments.Text.toString()
myDataSet.Tables(0).Rows.Add(myDataRow)
'Write to XML
myDataSet.WriteXml(strFilePath, XMLWriteMode.WriteSchema)
DisplayData()
'Clear textboxes
txtAuthor.Text = ""
txtSubject.Text = ""
txtComments.Text = ""
End Sub
Namespace yang digunakan adalah system.IO dan system.data
Membentuk Parser XML
public class TreeXML
{
private static TreeNode DoElement(XmlNode xn)
{
TreeNode tn = new TreeNode(xn.Name);
if (xn.Attributes != null && xn.Attributes.Count > 0)
{
TreeNode attr_node = tn.Nodes.Add("Attibutes");
foreach (XmlAttribute attr in xn.Attributes) // parcours des attributs
attr_node.Nodes.Add(attr.Name + "=" + attr.Value);
}
if (xn.Value != null && xn.Value != "")
tn.Text = xn.Value;
else
{
foreach (XmlNode subxn in xn.ChildNodes)
tn.Nodes.Add(DoElement(subxn));
}
return (tn);
}
public static TreeNode GetTreeNodeFromXML(string xml_file)
{
XmlDocument doc = new XmlDocument();
doc.Load(xml_file);
XmlNode root = doc.DocumentElement;
return (DoElement(root));
}
}
List Control DataBinding using XML
Program di bawah ini menyatakan bahwa ada berbagai macam cara untuk menampilkan daftar kontrol dengan berbagai maca tipe data yang mana pada saat ini difokuskan pada penggunaan file XML. Melalui penggunaan listbox di bawah dapat diketahui perluasan tehnik penggunaannya ke daftar kontrol yang lain yang merupakan turunan dari kelas System.Web.UI.WebControls.ListControl yang anggotanya termasuk CheckBoxList, DropDownList, dan RadioButtonList.
Input:
-
-
-
-
-
-
-
-
-
-
-
-
isi selanjutnya dapat dibuat sendiri
Listing program :
Dim strXmlFilePath As String = Server.MapPath("xmlboundlistcontrol.xml")
Sub Page_Load(obj as Object, e as EventArgs)
If not Page.IsPostBack Then
'Create a new DataSet
Dim myDataSet as DataSet = New DataSet
'Read XML file and populate tables
myDataSet.ReadXml(strXmlFilePath)
'Data bind RadioButtonList the verbose way
rblCrust.DataSource = myDataSet
rblCrust.DataMember = "crust"
rblCrust.DataBind()
'Data bind ListBox the shortcut way
lstTopping.DataSource = myDataSet.Tables("topping").DefaultView
lstTopping.DataBind()
'Data bind CheckBoxList in sorted order
Dim myDataView as DataView = myDataSet.Tables("addtopping").DefaultView
myDataView.Sort = "desc ASC"
cblAdditionalTopping.DataSource = myDataView
cblAdditionalTopping.DataBind()
'Data bind RadioButtonList
rblDoubleCheese.DataSource = myDataSet.Tables("yesno").DefaultView
rblDoubleCheese.DataBind()
End If
End Sub
Sub btnSubmit_Click(obj as Object, e as EventArgs)
Dim strOutput As String
'Output TextBox
strOutput ="
Patron Name: " + txtName.Text
'Output RadioButtonList
strOutput += "
Pizza Crust: " + rblCrust.SelectedItem.Value
'Output ListBox
strOutput += "
Pizza Topping: " + lstTopping.SelectedItem.Value
'Output CheckBoxList
Dim i as Integer
strOutput += "
Additional toppings:
"
For i = 0 to cblAdditionalTopping.Items.Count-1
If cblAdditionalTopping.Items(i).Selected Then
strOutput += cblAdditionalTopping.Items(i).Value + "
"
End If
Next
'Output RadioButtonList
strOutput += "
Double Cheese?" + rblDoubleCheese.SelectedItem.Value
lblOutput.Text = strOutput
End Sub
Add JavaScript popup to ASP Button
{
btnSubmit.Attributes.Add("onclick","javascript:if(confirm('Are you sure everything is correct?')== false) return false;");
}
void btnSubmit_Click(object sender, EventArgs e) {
Message.Text = "You entered your name as: " + txtName.Text;
}
Adding control to PlaceHolder dynamically
private void Page_Load(object sender, System.EventArgs e)
{
//buat placeholder
for(int x = 0; x <= 10; x++) {
Label title = new Label();
title.Text = "Item " + x.ToString();
title.ID = "Item" + x.ToString();
Area1.Controls.Add(title);
Area1.Controls.Add(new LiteralControl("
"));
}
}
private void ButtonChange_Click(object sender, System.EventArgs e)
{
((Label)(Area1.FindControl("Item" + txtId.Text.ToString()))).Text = txtName.Text.ToString();
}
Dynamic Thumbnail Image from ASP.Net
using System;
using System.Configuration;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Web;
public class ImageHandler : IHttpHandler
{
// ukuran maksimum dari thumbnail
const int MaxDim = 120;
public void ProcessRequest(HttpContext ctx)
{
// cache image untuk 1 hari
ctx.Response.ContentType = "image/jpeg";
ctx.Response.Cache.SetCacheability(HttpCacheability.Public);
ctx.Response.Cache.SetExpires(DateTime.Now.AddDays(1));
// temukan directory untuk penyimpanan image
string imageDir = ConfigurationSettings.AppSettings["imageDir"];
imageDir = Path.Combine(
ctx.Request.PhysicalApplicationPath, imageDir);
// temukan image yang diminta
string file = ctx.Request.QueryString["File"];
file = Path.Combine(imageDir, file);
// load gambar
using (Image img = new Bitmap(file))
{
// lakukan beberapa perhitungan matematika untuk mengubah ukuran image
int h = img.Height;
int w = img.Width;
int b = h > w ? h : w;
double per = (b > MaxDim) ? (MaxDim * 1.0) / b : 1.0;
h = (int)(h * per);
w = (int)(w * per);
// create the thumbnail image
using (Image img2 =
img.GetThumbnailImage(w, h,
new Image.GetThumbnailImageAbort(Abort),
IntPtr.Zero))
{
// emit it to the response strea,
img2.Save(ctx.Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
public bool IsReusable
{
get { return true; }
}
private bool Abort()
{
return false;
}
}
di bawah ini dituliskan class dari IhttpHandler
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Thumb
{
// class untuk show image
public class ShowImages : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataList dl;
protected System.Web.UI.WebControls.PlaceHolder ph;
protected string ShowName(object o)
{
DictionaryEntry d = (DictionaryEntry)o;
string file = d.Value.ToString();
return file.Substring(0, file.Length-4);
}
protected string GetJpgName(object o)
{
DictionaryEntry d = (DictionaryEntry)o;
return d.Value.ToString();
}
protected string GetImagePath(object o)
{
string imageDir = System.Configuration.ConfigurationSettings.AppSettings["imageDir"];
imageDir = Path.Combine(Request.ApplicationPath, imageDir);
DictionaryEntry d = (DictionaryEntry)o;
string file = d.Value.ToString();
file = Path.Combine(imageDir, file);
return file.Replace(@"\", @"/");
}
class ReverseComparer : IComparer
{
public int Compare(object x, object y)
{
DateTime l = (DateTime)x;
return -(l.CompareTo(y));
}
}
private void Page_Load(object sender, System.EventArgs e)
{
string imageDir = System.Configuration.ConfigurationSettings.AppSettings["imageDir"];
DirectoryInfo d = new DirectoryInfo(Path.Combine(Request.PhysicalApplicationPath, imageDir));
FileInfo[] f = d.GetFiles("*.jpg");
SortedList sl = new SortedList(new ReverseComparer());
for (int i = 0; i < f.Length; i++)
{
sl.Add(f[i].CreationTime, f[i].Name);
}
dl.DataSource = sl;
dl.DataBind();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Membuat dynamic Graphics dengan return .jpg
void Page_Load(Object s, EventArgs e) {
double photoWidth,photoHeight;
double percentageDifference = 0;
bool heHasAccess = false;
System.Drawing.Image inputImage;
//get information being sent
heHasAccess = true;
//get file name
string pictureFileName = Request.QueryString["f"];
if(pictureFileName == null || pictureFileName == "") {
heHasAccess = false;
}
//get width
try {
if (Request.QueryString["w"] == null) {
photoWidth = 0;
} else {
photoWidth = Int32.Parse(Request.QueryString["w"]);
}
}
catch {
photoWidth = 0;
}
//if anything went wrong, show error picture
if(!heHasAccess) {
inputImage = System.Drawing.Image.FromFile(Server.MapPath("images/pictureNoAccess.jpg"));
} else {
inputImage = System.Drawing.Image.FromFile(Server.MapPath("images/" + pictureFileName));
}
//if no width was given, assume the default now
if(photoWidth==0) {
if(!heHasAccess) {
photoWidth = 100;
} else {
photoWidth = inputImage.Width;
}
}
//define size for new image
percentageDifference = inputImage.Width / photoWidth;
photoHeight = inputImage.Height / percentageDifference;
//output new image with different size
Bitmap outputBitMap = new Bitmap(inputImage,Convert.ToInt32(photoWidth),Convert.ToInt32(photoHeight));
Response.ContentType = "image/jpeg";
outputBitMap.Save(Response.OutputStream, ImageFormat.Jpeg);
}
Akses MySQL dari ASP.Net
Namespace yang digunakan adalah system.Data dan system.Data.odbc
public void Page_Load(Object sender, EventArgs e) {
DataTable dtRecords = GetDataTable("SELECT * FROM newone");
foreach(DataRow dr in dtRecords.Rows) {
Response.Write(dr["FirstName"].ToString() + " " + dr["LastName"].ToString() + "
");
}
}
private static string GetConnection() {
return "DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=testdatabase";
}
public static DataTable GetDataTable(string sql) {
DataTable rt = new DataTable();
DataSet ds = new DataSet();
OdbcDataAdapter da = new OdbcDataAdapter();
OdbcConnection con = new OdbcConnection(GetConnection());
OdbcCommand cmd = new OdbcCommand(sql, con);
da.SelectCommand = cmd;
da.Fill(ds);
try {
rt = ds.Tables[0];
}
catch {
rt = null;
}
return rt;
}
Dynamic Coloumn Sorting and Paging
Pada bagian Page langguage="VB" tambahkan tag berikut:
Page Language="VB" Debug="False" Strict="True" Explicit="True" Buffer="True
Namespace yang digunakan adalah system, system.Data, Syste.Data.SqlClient
Sub Page_Load (sender As Object, e As EventArgs)
If SortExp.Text = "" then
BindSQL ("title asc")
Else
BindSQL (SortExp.Text)
End If
End Sub
Sub BindSQL (SortField As String)
Dim MyConnection As SqlConnection
Dim MyCommand As SqlDataAdapter
Dim DS as Dataset
Dim sqlStr As String = "SELECT authors.au_fname, authors.au_lname, titles.title, titles.price FROM authors, titleauthor, titles WHERE titleauthor.au_id = authors.au_id AND titleauthor.title_id = titles.title_id ORDER BY title asc"
Dim strConn As String = "server=(local);uid=sa;pwd=;database=pubs;Trusted_Connection=yes;"
Dim RcdCount As Integer
SortExp.Text = SortField
MyConnection = New SqlConnection(strConn)
MyCommand = New SqlDataAdapter(sqlStr, MyConnection)
DS = new Dataset()
MyCommand.Fill(DS, "pubs")
Dim Source As DataView = DS.Tables(0).DefaultView
Source.Sort = SortField
Pubs.DataSource = Source
Pubs.Databind()
End Sub
Function SortOrder (Field As String) As String
Dim so As String = SortExp.Text
If Field = so Then
SortOrder = Replace (Field,"asc","desc")
Else
SortOrder = Replace (Field,"desc","asc")
End If
End Function
Sub BookList_Sort (Sender As Object, E As DataGridSortCommandEventArgs)
pubs.CurrentPageIndex = 0 'To sort from top
BindSQL (SortOrder (E.SortExpression).ToString()) 'Rebind our Datagrid
End Sub
Sub BookList_PageChange (Source As Object, E As DataGridPageChangedEventArgs)
pubs.CurrentPageIndex = E.NewPageIndex
BindSQL(SortOrder(SortExp.Text))
End Sub
//yang harus diletakkan pada bagian HTML
//Pada ASP:DataGrid tambahkan :
id="Pubs" runat="server"
Pagesize="10"
AllowSorting="True"
AllowPaging="True"
AllowCustomPaging="False"
PagerStyle-Visible = "True"
PagerStyle-Mode = "NumericPages"
HeaderStyle-BackColor="Blue"
HeaderStyle-ForeColor="White"
OnSortCommand="BookList_Sort"
OnPageIndexChanged="BookList_PageChange"
AutoGenerateColumns="false"
//Pada pembentukan boundColumn yang harus ditambahkan SortExpression="
Monday, June 06, 2005
Melindungi file menggunakan form authentication
Sebagai contoh, bila ingin agar ekstensi file gif di mapping agar semua file image dilindungi maka masukkan lokasi aspnet_isapi.dll file pada teks box "Executable" dan extension ".gif" pada teks box"Extension" lalu klik "OK". Setelah itu , restart IIS.
Setelah IIS direstart, pastikan agar tidak ada persistantcookies dari site yang memiliki form authentication.
Button Print
Membuat button untuk print page
Pada event page load tambahkan atribut pada buttonnya
btnPrint.Attributes("onClick") ="javascript:window.print();"
Menggunakan UDL untuk connectionstring
pertama simpan udl tersebut pada file web.config
buat koneksistringnya:
Dim strConn = "File name=" & ConfigurationSettings.AppSettings("My-UDL")
Komparasi waktu
Dim t2 As String = DateTime.Now.ToString("t")
If DateTime.Compare(t1, t2) < 0 Then
Response.Write(t1.ToString() & " is < than " & t2.ToString())
Else
Response.Write(t1.ToString() & " is > than " & t2.ToString())
End If
semoga membantu...
DataReader vs DataSet
If you are requesting data that is going to be used/accessed multiple times, use the DataSet - It grabs the data from the table, puts it in memory and then closes the connection
DataReader lebih cepat dari dataset.
tetapi jika request data berulangkali atau mengakses berulangkali lebih baik menggunakan dataset, karena dataset mengrab table ke memory dan menutup koneksi.
Cek dataset jika empty
tables(0) adalah table ke 0.
dataset dapat menampung banyak tabel.
If ds.Tables(0).Rows.Count >0 then
'databinding
Else
' pesan bahwa dataset empty
End if
Kalkulasi umur dari tanggal lahir
Dim BirthDate as DateTime
' konversi dulu input ke datetime
BirthDate = CDate(txtBirthDate.text)
Dim diff as TimeSpan = CurrentDate.Subtract(BirthDate)
' "Cint" konversikan ke integer value (tanpa koma)
lblShowAge.text=Cint(diff.Days/365)
semoga membantu
Membuat link Mailto pada Datagrid
misalnya punya tabel database dimana ada field email. Trus kalau diklik bisa membuka outlook express, spt "href=mailto:aa@aa.com"
Pertama buat datagridnya dulu, trus diantara start dan end tag pada datagrid diberi tag start dan end 'Columns' . Dimana pada start, end tag 'columns' diberi templateColumn,
<Columns>
<i>....taruh boundcolumns lainnya yang ingin kmu taruh disini</i>
<asp:TemplateColumn HeaderText="Email Address" HeaderStyle-Font-Bold="True">
<ItemTemplate>
<A HREF="Mailto:<%# Container.DataItem("email") %>">
<%# Container.DataItem("email") %>
</a>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
attachment pada email
objMail.Attachments.Add(new MailAttachment(server.MapPath("/Fileattachment.zip")))
semoga membantu
Membuat aplikasi notepad menggunakan MDI dan file stream
Dim sw As StreamWriter
Dim sr As StreamReader
Public nm As String = ""
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
If ToolBar1.Buttons.IndexOf(e.Button) = 0 Then
If nm = "" Then
SaveFileDialog1.ShowDialog()
nm = SaveFileDialog1.FileName
fs = New FileStream(nm, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
sw = New StreamWriter(fs)
sw.WriteLine(RichTextBox1.Text)
sw.Close()
fs.Close()
Else
fs = New FileStream(nm, FileMode.OpenOrCreate)
sw = New StreamWriter(fs)
sw.BaseStream.Seek(0, SeekOrigin.Begin)
sw.WriteLine(RichTextBox1.Text)
sw.Flush()
sw.Close()
fs.Close()
End If
Else
OpenFileDialog1.ShowDialog()
nm = OpenFileDialog1.FileName
fs = New FileStream(nm, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
sr = New StreamReader(fs)
RichTextBox1.Text = sr.ReadToEnd()
sr.Close()
fs.Close()
End If
End Sub
Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click
SaveFileDialog1.ShowDialog()
Dim nm As String = SaveFileDialog1.FileName
fs = New FileStream(nm, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
sw = New StreamWriter(fs)
sw.WriteLine(RichTextBox1.Text)
sw.Flush()
sw.Close()
End Sub
Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click
Close()
End Sub
Private Sub MenuItem7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem7.Click
FontDialog1.ShowApply = True
FontDialog1.ShowColor = True
FontDialog1.ShowEffects = True
FontDialog1.ShowDialog()
RichTextBox1.Font = FontDialog1.Font
RichTextBox1.ForeColor = FontDialog1.Color
End Sub
Private Sub MenuItem9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem9.Click
RichTextBox1.Text = ""
nm = ""
End Sub
Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
OpenFileDialog1.ShowDialog()
nm = OpenFileDialog1.FileName
fs = New FileStream(nm, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
sr = New StreamReader(fs)
RichTextBox1.Text = sr.ReadToEnd()
sr.Close()
fs.Close()
End Sub
Private Sub MenuItem8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem8.Click
ColorDialog1.ShowDialog()
RichTextBox1.ForeColor = ColorDialog1.Color
End Sub
End Class
Sunday, June 05, 2005
Mendapatkan Panjang dan lebar dari stringmu untuk image yang dinamis
private SizeF CheckWidth(string mystring){
String FontFace;
int FontSize;
FontFace="Arial";
FontSize=8;
Font menuFont = new Font(FontFace,FontSize,System.Drawing.FontStyle.Bold);
SizeF CurrentWidth = new SizeF(0,0);
Bitmap b = new Bitmap(12,12); Graphics g = Graphics.FromImage(b);
CurrentWidth = g.MeasureString(mystring,menuFont);
g.Dispose();
b.Dispose();
return CurrentWidth;
}
Prompt User agar Save saat meninggalkan halaman/page
Kita membuat extended class dari Page class dengan method yang bila dipanggil dapat melakukan script client-side sehingga apabila user hendak meninggalkan halaman setelah merubah tanpa menyimpannya, konfirmasi akan ditampilkan
MonitorChanges(webControl)
Method ini menerima webControl seperti TextBox, CheckBox, DropDownList, dan sebagainya)
dan menambahkan script client-side yang diperlukan untuk memonitor nilai dari control. Jika nilai dari control berubah dan user akan meninggalkan halaman tanpa menyimpannya, maka akan muncul warning
BypassModifiedMethod(webControl)
Method ini digunakan untuk mengindikasikan agar Web Control tertentu tidak boleh menyebabkan konfirmasi ditampilkan. Umumnya digunakan pada Web Control Button dan LinkButton, yaitu WebControl yang menyebabkan postback, tetapi jika dilakukan perubahan, tidak perlu menampilkan konfirmasi
Untuk menghasilkan client-side script yang benar, ada 3 method pada class Page yaitu
1.RegisterClientScriptBlock(key,script)
2.RegisterStartUpScript(key,script)
3.RegisterArrayDeclaration(namaArray,nilaiArray)
Method server-side ini menambahkan code client-side ke page ASP.NET yang markupnya dirender.
Pada RegisterClientScriptBlock(key,script) dan RegisterStartUpScript(key,script), key secara unik mengidentifikasikan blok script yang akan di-inject dan script bernilai script yang sebenarnya ajan di-inject (harus ada markup yang benar, termasuk tag < script> itu sendiri).Kedua method ini meng-inject(memasukkan) script dalam tag < form> , perbedaannya adalah RegisterClientScriptBlock(key,script) memasukkan script sebelum Web controls dalam form, sedangkan RegisterStartUpScript(key,script) dimasukkan setelah markup Web controls.
Contoh penggunaan RegisterArrayDeclaration(namaArray,nilaiArray)
Page.RegisterArrayDeclaration("foo", "1");
Page.RegisterArrayDeclaration("foo", "2");
...
Page.RegisterArrayDeclaration("foo", "n");
Method ini membuat array client-side dengan nilai yang ditentukan. Code di atas digunakan untuk membuat array dengan nama foo dengan nilai 1 sampai n
MonitorChanges(webControl) merupakan method dari ClientSidePage (turunan class Page) yang melakukan dua hal:
1.Menambahkan client-side Web control ID ke client-side array(array ini mengambil nilai awal dari input control dan saat page exit digunakan untuk mengetahui apakah nilainya berubah)
2.Memasukkan script client-code yang menyimpan nilai awal field dan menangani event onbeforeunload client-side
Public Class ClientSidePage
Inherits System.Web.UI.Page
Public Sub MonitorChanges(ByVal wc As WebControl)
If wc Is Nothing Then Exit Sub
If TypeOf wc Is CheckBoxList OrElse TypeOf wc Is RadioButtonList Then
'Menambahkan elemen array untuk setiap item dalam checkbox/radiobutton list
For i As Integer = 0 To CType(wc, ListControl).Items.Count - 1
Page.RegisterArrayDeclaration("monitorChangesIDs", """" & _
String.Concat(wc.ClientID, "_", i) & """")
Page.RegisterArrayDeclaration("monitorChangesValues", "null")
Next
Else
Page.RegisterArrayDeclaration("monitorChangesIDs", _
"""" & wc.ClientID & """")
Page.RegisterArrayDeclaration("monitorChangesValues", "null")
End If
AssignMonitorChangeValuesOnPageLoad()
End Sub
Private Sub AssignMonitorChangeValuesOnPageLoad()
If Not Page.IsStartupScriptRegistered("monitorChangesAssignment") Then
Page.RegisterStartupScript("monitorChangesAssignment", _
"< script language=""JavaScript""> " & vbCrLf & _
" assignInitialValuesForMonitorChanges();" & vbCrLf & _
"< /script> ")
Page.RegisterClientScriptBlock("monitorChangesAssignmentFunction", _
"< script language=""JavaScript""> " & vbCrLf & _
" function assignInitialValuesForMonitorChanges() {" & vbCrLf & _
" for (var i = 0; i < monitorChangesIDs.length; i++) {" & vbCrLf & _
" var elem = document.getElementById(monitorChangesIDs[i]);" & vbCrLf & _
" if (elem) if (elem.type == 'checkbox' || elem.type == 'radio') " & _
" monitorChangesValues[i] = elem.checked; " & _
" else monitorChangesValues[i] = elem.value;" & vbCrLf & _
" }" & vbCrLf & _
" }" & vbCrLf & vbCrLf & vbCrLf & _
" var needToConfirm = true;" & vbCrLf & _
" window.onbeforeunload = confirmClose;" & vbCrLf & vbCrLf & _
" function confirmClose() {" & vbCrLf & _
" if (!needToConfirm) return;" & vbCrLf & _
" for (var i = 0; i < monitorChangesValues.length; i++) {" & vbCrLf & _
" var elem = document.getElementById(monitorChangesIDs[i]);" & vbCrLf & _
" if (elem) if (((elem.type == 'checkbox' || elem.type == 'radio') && elem.checked != monitorChangesValues[i]) || (elem.type != 'checkbox' && elem.type != 'radio' && elem.value != monitorChangesValues[i])) { needToConfirm = false; setTimeout('resetFlag()', 750); return ""You have modified the data entry fields since last savings. If you leave this page, any changes will be lost. To save these changes, click Cancel to return to the page, and then Save the data.""; }" & vbCrLf & _
" }" & vbCrLf & _
" }" & vbCrLf & vbCrLf & _
" function resetFlag() { needToConfirm = true; } " & vbCrLf & _
"< /script> ")
End If
End Sub
...
End Class
Pengecualian Button agar tidak prompt ke user
Public Class ClientSidePage
Inherits System.Web.UI.Page
...
Public Sub BypassModifiedMethod(ByVal wc As WebControl)
wc.Attributes("onclick") = "javascript:" & GetBypassModifiedMethodScript()
End Sub
Public Function GetBypassModifiedMethodScript() As String
Return "needToConfirm = false;"
End Function
End Class
Penggunaan class ClientSidePage pada ASP.NET WebPage
Public Class WebForm1
Inherits ClientSidePage
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Memonitor perubahan pada Web control yang nilainya perlu diamati
MonitorChanges(name)
MonitorChanges(useASPNET)
MonitorChanges(favColor)
MonitorChanges(musicLikes)
MonitorChanges(favSport)
'Untuk control seperti button save yang menyebabkan postback yang TIDAK BOLEH
'prompt ke user, panggil method BypassModifiedMethod
BypassModifiedMethod(btnSave)
End Sub
...
End Class
Mematikan prompt untuk AutoPostback Web Control
Contoh :
DropDownListInstance.Attributes("onchange") = GetBypassModifiedMethodScript()
Selamat mencoba!
Aplikasi Web Integrated Quiz dengan Graphical Score Report
yang digunakan adalah file XML. Pemegang data antar halaman adalah session bag(Viewstate[ data ]).
Ada 3 panel yaitu panel kuis(quiz panel), panel review dan panel laporan skor(score report). Di laporan skor, progress bar control dibuat
sendiri.
Database yang digunakan adalah sebagai berikut:
<pre>
<?xml version="1.0" encoding="utf-8" ?>
<quiz>
<mc>
<question correctAnsNo='1'>Which of the fol....?
</question>
<answer correct='No' ><![CDATA[ <img src="x...]]>
</answer>
<answer correct='No' ><![CDATA[ <img src="x...]]>
</answer>
<answer correct='Yes'><![CDATA[ <img src="x...]]>
</answer>
<answer correct='No' ><![CDATA[ I Don't Know ]]>
</answer>
</mc>
</quiz>
</pre>
Quiz user control mempunyai 4 metode:
ShowQuestion(int _qNo)
Review()
ReAnswer()
ShowResult()
Pertama kali,di bawah ini adalah beberapa variabel yang digunakan :
//membuat xmlDocument holder
XmlDocument doc=new XmlDocument();
//membuat empty navigator dengan tujuan untuk navigasi
//di XMLDocument
XPathNavigator nav;
//untuk loop
XPathNodeIterator nodeItrator;
//memegang jawaban user
ArrayList historyALst=new ArrayList();
//memegang pertanyaan yang di-bookmark
ArrayList bookmarkLst=new ArrayList();
digunakan untuk mengganti index 1 dengan A dan 2 dengan B
char[] perfix=new char[10] {'A','B','C','D','F','G','H','J','K','L'};
int currentQNo; //nomer pertanyaan sekarang
int totalQNumber; // totral pertanyaan kuis
int totalMarkedQuestion; // total pertanyaan yang ditandai
int currentMarkedQuestion; //nomer pertanyaan yang ditandai sekarang
int markLoop;
DateTime startTime; // waktu kuis dimulai
TimeSpan spentTime;
bool isReview; //untuk mengindikasikan status pertanyaan sekarang
bool wasChecked=false; //ditandai sebagai Q yang bertanda dalam Review report.
Code pada page load:
private void Page_Load(object sender, System.EventArgs e)
{
//load database XML
doc.Load(Server.MapPath("quiz.xml"));
//menciptakan navigator untuk load file xml
nav=doc.CreateNavigator();
//Apakah kuis baru??
if(!IsPostBack)
{
//Ya
quizPanal.Visible=true;// tampilkan layar kuis.
//mencatat waktu mulai
startTime=DateTime.Now;
currentQNo=1;
//menhitung dan mencatat Total nomer pertanyaan
//menggunakan XmlDocumentnavigator dengan passing
//XPath string dari node pertanyaan(question) ( <mc>...</mc>)
totalQNumber=nav.Select("//mc").Count;
//simpan data pada Session Viewstate
ViewState["startTime"]=startTime;
ViewState["totalQNumber"]=totalQNumber;
ViewState["currentQNo"]=currentQNo;
ViewState["score"]=0;
//pergi ke pertanyaan yang pertama
ShowQuestion(currentQNo);
}
}
Render pertanyaan multiple choice yang khusus. metode ini mengambil nomer pertanyaan sebagai
parameter, dan menggunakan nomer ini di dalam string XPath yang berbeda untuk
navigasi diantara node XML
public void ShowQuestion(int _qNo)
{
quizPanal.Visible=true;
answersRBL.Items.Clear();
//menerima Data dari session and menghitung waktu yang telah digunakan
startTime=(DateTime)ViewState["startTime"];
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
spentTime=DateTime.Now.Subtract(startTime);
//XPath String dari node pertanyaan yang sekarang
//quiz/mc[current question number]
string xPath="quiz/mc["+_qNo.ToString()+"]";
int counter=1;
string str;
nodeItrator=nav.Select(xPath+"/question");
nodeItrator.MoveNext();
//menampilkan beberapa data
qNoLbl.Text="Q: "+_qNo.ToString()+" / "+totalQNumber.ToString();
questionLbl.Text=_qNo.ToString()+": "+nodeItrator.Current.Value;
spentTimeLbl.Text=spentTime.Minutes.ToString()
+"~"+spentTime.Seconds.ToString();
nodeItrator=nav.Select(xPath+"/answer");
while(nodeItrator.MoveNext())
{
str=counter.ToString();
answersRBL.Items.Add(new ListItem(perfix[counter-1].ToString()
+":"+nodeItrator.Current.Value,str));
if(nodeItrator.Current.GetAttribute("correct","")=="Yes")
{
ViewState["correctAnswer"]=counter;
}
counter++;//next
}
Setelah itu, user review history jawaban dan diijinkan untuk melihat review score Report
/// menghasilkan Review Report
/// dengan menerima jawaban user dari historyALst ArrayList
public void Review()
{
revisionPanal.Visible=true;
int seqance=0;
string _is="No";
bookmarkLst=(ArrayList)ViewState["bookmarkLst"];
historyALst=(ArrayList)ViewState["historyALst"];
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
wasChecked=Convert.ToBoolean(ViewState["wasChecked"]);
if(!wasChecked){ /* No */ markBtn.Enabled=false;}
//menciptakan laporan sejarah jawaban
//header tabel
TableCell c=new TableCell();
TableCell cc=new TableCell();
TableCell ccc=new TableCell();
c.Text="Question No.";
cc.Text="Your Answer";
ccc.Text="Bookmark ?";
TableRow hr=new TableRow();
hr.Cells.Add(c);
hr.Cells.Add(cc);
hr.Cells.Add(ccc);
hr.ForeColor=Color.White;
hr.BackColor=Color.LightSlateGray;
Table1.Rows.Add(hr);
Table1.Font.Bold=true;
for(int i=1;i<=totalQNumber;i++)
{
TableCell c1=new TableCell();
c1.Text=i.ToString();
//Cell: jawabanmu A,B, or C...
TableCell c2=new TableCell();
c2.HorizontalAlign=HorizontalAlign.Center;
c2.Text=perfix[Convert.ToInt32(historyALst[i-1])-1].ToString();
//Cell: bookmark atau tidak
TableCell c3=new TableCell();
for(int n=0;n < bookmarkLst.Count;n++)
{
if(Convert.ToInt32(bookmarkLst[n].ToString())==i)
{//Ya
_is=" Yes ";
}
}
c3.Text=_is;
c3.HorizontalAlign=HorizontalAlign.Center;//align=center
_is=" No ";
TableRow r=new TableRow();
r.Cells.Add(c1);
r.Cells.Add(c2);
r.Cells.Add(c3);
r.ForeColor=Color.SlateGray;
if(seqance % 2 != 0)
{
r.BackColor=Color.Gainsboro;
}
Table1.Rows.Add(r);
eqance++;
}//end for
}//end method
Jika user memutuskan untuk kembali, kemudian
ReAnswer():
public void ReAnswer()
{
quizPanal.Visible=true;
isReview=true;
//menerima data
bookmarkLst=(ArrayList)ViewState["bookmarkLst"];
totalMarkedQuestion=bookmarkLst.Count;
currentMarkedQuestion=Convert.ToInt32(bookmarkLst[0]);
//menyimpan data
markLoop=1;
ViewState["markLoop"]=markLoop;
ViewState["isReview"]=isReview;
ViewState["totalMarkedQuestion"]=totalMarkedQuestion;
ViewState["currentMarkedQuestion"]=currentMarkedQuestion;
//Tampilkan pertanyaan yang ditandai pertama
ShowQuestion(currentMarkedQuestion);
}//end method
Pada akhirnya , panggil Score report: ShowResult()
/// menghasilkan Score Report
/// dengan perhitungan sederhana
public void ShowResult()
{
resultPanal.Visible=true;
//menerima data
int score=Convert.ToInt32(ViewState["score"]);
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
startTime=(DateTime)ViewState["startTime"];
spentTime=DateTime.Now.Subtract(startTime);
progressBar.Total=totalQNumber*100;
//taruh skormu sebagai nilai progress bar
progressBar.Value=score*100;
//tanggal
dateLbl.Text=DateTime.Now.ToUniversalTime().ToShortDateString();
totalQNoREsLbl.Text=totalQNumber.ToString();
//Total Score (sebagai Total pertanyaan * 100 )
totalScoreLbl.Text=(totalQNumber*100).ToString();
//Skor-mu (as jawaban yang benar * 100)
scoreLbl.Text=(score*100).ToString();
//jumlah jawaban yang benar
correctAnswersLbl.Text=score.ToString();
//passing score
passingScoreLbl.Text=(totalQNumber*100/2).ToString();
//waktu yang dihabiskan
timeTakenLbl.Text=spentTime.Hours.ToString()
+"<font color=\"#666699\">:</font>"
+spentTime.Minutes.ToString()
+"<font color=\"#666699\">:</font>"
+spentTime.Seconds.ToString()
+"<font color=\"#666699\" size=\"1\">Hr(s).</font>";
//Sukses atau...
if((score*100/totalQNumber)<50)
{
gradeLbl.ForeColor=Color.Red;
gradeLbl.Text="Failed";
}
else
{
gradeLbl.ForeColor=Color.Green;
gradeLbl.Text="Success";
}
}//end method
Aplikasi Web Integrated Quiz dengan Graphical Score Report
yang digunakan adalah file XML. Pemegang data antar halaman adalah session bag(Viewstate[ data ]).
Ada 3 panel yaitu panel kuis(quiz panel), panel review dan panel laporan skor(score report). Di laporan skor, progress bar control dibuat
sendiri.
Database yang digunakan adalah sebagai berikut:
<pre>
<?xml version="1.0" encoding="utf-8" ?>
<quiz>
<mc>
<question correctAnsNo='1'>Which of the fol....?
</question>
<answer correct='No' ><![CDATA[ <img src="x...]]>
</answer>
<answer correct='No' ><![CDATA[ <img src="x...]]>
</answer>
<answer correct='Yes'><![CDATA[ <img src="x...]]>
</answer>
<answer correct='No' ><![CDATA[ I Don't Know ]]>
</answer>
</mc>
</quiz>
</pre>
Quiz user control mempunyai 4 metode:
ShowQuestion(int _qNo)
Review()
ReAnswer()
ShowResult()
Pertama kali,di bawah ini adalah beberapa variabel yang digunakan :
//membuat xmlDocument holder
XmlDocument doc=new XmlDocument();
//membuat empty navigator dengan tujuan untuk navigasi
//di XMLDocument
XPathNavigator nav;
//untuk loop
XPathNodeIterator nodeItrator;
//memegang jawaban user
ArrayList historyALst=new ArrayList();
//memegang pertanyaan yang di-bookmark
ArrayList bookmarkLst=new ArrayList();
digunakan untuk mengganti index 1 dengan A dan 2 dengan B
char[] perfix=new char[10] {'A','B','C','D','F','G','H','J','K','L'};
int currentQNo; //nomer pertanyaan sekarang
int totalQNumber; // totral pertanyaan kuis
int totalMarkedQuestion; // total pertanyaan yang ditandai
int currentMarkedQuestion; //nomer pertanyaan yang ditandai sekarang
int markLoop;
DateTime startTime; // waktu kuis dimulai
TimeSpan spentTime;
bool isReview; //untuk mengindikasikan status pertanyaan sekarang
bool wasChecked=false; //ditandai sebagai Q yang bertanda dalam Review report.
Code pada page load:
private void Page_Load(object sender, System.EventArgs e)
{
//load database XML
doc.Load(Server.MapPath("quiz.xml"));
//menciptakan navigator untuk load file xml
nav=doc.CreateNavigator();
//Apakah kuis baru??
if(!IsPostBack)
{
//Ya
quizPanal.Visible=true;// tampilkan layar kuis.
//mencatat waktu mulai
startTime=DateTime.Now;
currentQNo=1;
//menhitung dan mencatat Total nomer pertanyaan
//menggunakan XmlDocumentnavigator dengan passing
//XPath string dari node pertanyaan(question) ( <mc>...</mc>)
totalQNumber=nav.Select("//mc").Count;
//simpan data pada Session Viewstate
ViewState["startTime"]=startTime;
ViewState["totalQNumber"]=totalQNumber;
ViewState["currentQNo"]=currentQNo;
ViewState["score"]=0;
//pergi ke pertanyaan yang pertama
ShowQuestion(currentQNo);
}
}
Render pertanyaan multiple choice yang khusus. metode ini mengambil nomer pertanyaan sebagai
parameter, dan menggunakan nomer ini di dalam string XPath yang berbeda untuk
navigasi diantara node XML
public void ShowQuestion(int _qNo)
{
quizPanal.Visible=true;
answersRBL.Items.Clear();
//menerima Data dari session and menghitung waktu yang telah digunakan
startTime=(DateTime)ViewState["startTime"];
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
spentTime=DateTime.Now.Subtract(startTime);
//XPath String dari node pertanyaan yang sekarang
//quiz/mc[current question number]
string xPath="quiz/mc["+_qNo.ToString()+"]";
int counter=1;
string str;
nodeItrator=nav.Select(xPath+"/question");
nodeItrator.MoveNext();
//menampilkan beberapa data
qNoLbl.Text="Q: "+_qNo.ToString()+" / "+totalQNumber.ToString();
questionLbl.Text=_qNo.ToString()+": "+nodeItrator.Current.Value;
spentTimeLbl.Text=spentTime.Minutes.ToString()
+"~"+spentTime.Seconds.ToString();
nodeItrator=nav.Select(xPath+"/answer");
while(nodeItrator.MoveNext())
{
str=counter.ToString();
answersRBL.Items.Add(new ListItem(perfix[counter-1].ToString()
+":"+nodeItrator.Current.Value,str));
if(nodeItrator.Current.GetAttribute("correct","")=="Yes")
{
ViewState["correctAnswer"]=counter;
}
counter++;//next
}
Setelah itu, user review history jawaban dan diijinkan untuk melihat review score Report
/// menghasilkan Review Report
/// dengan menerima jawaban user dari historyALst ArrayList
public void Review()
{
revisionPanal.Visible=true;
int seqance=0;
string _is="No";
bookmarkLst=(ArrayList)ViewState["bookmarkLst"];
historyALst=(ArrayList)ViewState["historyALst"];
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
wasChecked=Convert.ToBoolean(ViewState["wasChecked"]);
if(!wasChecked){ /* No */ markBtn.Enabled=false;}
//menciptakan laporan sejarah jawaban
//header tabel
TableCell c=new TableCell();
TableCell cc=new TableCell();
TableCell ccc=new TableCell();
c.Text="Question No.";
cc.Text="Your Answer";
ccc.Text="Bookmark ?";
TableRow hr=new TableRow();
hr.Cells.Add(c);
hr.Cells.Add(cc);
hr.Cells.Add(ccc);
hr.ForeColor=Color.White;
hr.BackColor=Color.LightSlateGray;
Table1.Rows.Add(hr);
Table1.Font.Bold=true;
for(int i=1;i<=totalQNumber;i++)
{
TableCell c1=new TableCell();
c1.Text=i.ToString();
//Cell: jawabanmu A,B, or C...
TableCell c2=new TableCell();
c2.HorizontalAlign=HorizontalAlign.Center;
c2.Text=perfix[Convert.ToInt32(historyALst[i-1])-1].ToString();
//Cell: bookmark atau tidak
TableCell c3=new TableCell();
for(int n=0;n < bookmarkLst.Count;n++)
{
if(Convert.ToInt32(bookmarkLst[n].ToString())==i)
{//Ya
_is=" Yes ";
}
}
c3.Text=_is;
c3.HorizontalAlign=HorizontalAlign.Center;//align=center
_is=" No ";
TableRow r=new TableRow();
r.Cells.Add(c1);
r.Cells.Add(c2);
r.Cells.Add(c3);
r.ForeColor=Color.SlateGray;
if(seqance % 2 != 0)
{
r.BackColor=Color.Gainsboro;
}
Table1.Rows.Add(r);
eqance++;
}//end for
}//end method
Jika user memutuskan untuk kembali, kemudian
ReAnswer():
public void ReAnswer()
{
quizPanal.Visible=true;
isReview=true;
//menerima data
bookmarkLst=(ArrayList)ViewState["bookmarkLst"];
totalMarkedQuestion=bookmarkLst.Count;
currentMarkedQuestion=Convert.ToInt32(bookmarkLst[0]);
//menyimpan data
markLoop=1;
ViewState["markLoop"]=markLoop;
ViewState["isReview"]=isReview;
ViewState["totalMarkedQuestion"]=totalMarkedQuestion;
ViewState["currentMarkedQuestion"]=currentMarkedQuestion;
//Tampilkan pertanyaan yang ditandai pertama
ShowQuestion(currentMarkedQuestion);
}//end method
Pada akhirnya , panggil Score report: ShowResult()
/// menghasilkan Score Report
/// dengan perhitungan sederhana
public void ShowResult()
{
resultPanal.Visible=true;
//menerima data
int score=Convert.ToInt32(ViewState["score"]);
totalQNumber=Convert.ToInt32(ViewState["totalQNumber"]);
startTime=(DateTime)ViewState["startTime"];
spentTime=DateTime.Now.Subtract(startTime);
progressBar.Total=totalQNumber*100;
//taruh skormu sebagai nilai progress bar
progressBar.Value=score*100;
//tanggal
dateLbl.Text=DateTime.Now.ToUniversalTime().ToShortDateString();
totalQNoREsLbl.Text=totalQNumber.ToString();
//Total Score (sebagai Total pertanyaan * 100 )
totalScoreLbl.Text=(totalQNumber*100).ToString();
//Skor-mu (as jawaban yang benar * 100)
scoreLbl.Text=(score*100).ToString();
//jumlah jawaban yang benar
correctAnswersLbl.Text=score.ToString();
//passing score
passingScoreLbl.Text=(totalQNumber*100/2).ToString();
//waktu yang dihabiskan
timeTakenLbl.Text=spentTime.Hours.ToString()
+"<font color=\"#666699\">:</font>"
+spentTime.Minutes.ToString()
+"<font color=\"#666699\">:</font>"
+spentTime.Seconds.ToString()
+"<font color=\"#666699\" size=\"1\">Hr(s).</font>";
//Sukses atau...
if((score*100/totalQNumber)<50)
{
gradeLbl.ForeColor=Color.Red;
gradeLbl.Text="Failed";
}
else
{
gradeLbl.ForeColor=Color.Green;
gradeLbl.Text="Success";
}
}//end method
Saturday, June 04, 2005
Menampilkan informasi tentang proses ASP.NET
GetCurrentProcessInfo() mengembalikan nilai instance dari class ProcessInfo yang mengandung informasi tentang proses ASP.NET seperti kapan proses dimulai, penggunaan memory, kapan terakhir di-shutdown, proses ID, berapa lama sudah berjalan, dan statusnya saat ini.
GetHistory(n) mengembalikan array dari class-class ProcessInfo, merepresentasikan informasi tentang n proses ASP.NET sebelumnya.
Contoh kode bila ingin membuat halaman administrator yang menampilkan proses ID, waktu mulai, waktu berjalan, dan peak memory yang digunakan untuk proses ASP.NET :
< script runat="server">
Sub Page_Load(sender as Object, e as EventArgs)
Dim objCurrentInfo as ProcessInfo = ProcessModelInfo.GetCurrentProcessInfo()
lblProcID.Text = objCurrentInfo.ProcessID
lblStartTime.Text = objCurrentInfo.StartTime
lblRunningTime.Text = objCurrentInfo.Age.Days & " days, " & _
objCurrentInfo.Age.Hours & ":" & objCurrentInfo.Age.Minutes
lblPeakMem.Text = objCurrentInfo.PeakMemoryUsed
End Sub
< /script>
< html>
< head>
< /head>
< body>
< h1 align="center"> Web Server Statistics< /h1>
< table cellspacing="1" align="center" border="1">
< tbody>
< tr>
< td align="left"> ASP.NET Process ID:
< /td>
< td align="middle">
< asp:label id="lblProcID" runat="server"> < /asp:label>
< /td>
< /tr>
< tr>
< td align="left"> ASP.NET was Started at:
< /td>
< td align="middle">
< asp:label id="lblStartTime" runat="server"> < /asp:label>
< /td>
< /tr>
< tr>
< td align="left"> ASP.NET has been running for:
< /td>
< td align="middle">
< asp:label id="lblRunningTime" runat="server"> < /asp:label>
< /td>
< /tr>
< tr>
< td align="left"> Peak Memory Used:
< /td>
< td align="middle">
< asp:label id="lblPeakMem" runat="server"> < /asp:label>
KB
< /td>
< /tr>
< /tbody>
< /table>
< /body>
< /html>
Menampilkan proses ASP.NET sudah cukup keren :) , tetapi administrator juga mungkin ingin mengetahui 10 proses terakhir, kapan mulainya, berapa lama, dan kapan proses tersebut berhenti. Untuk dapat menampilkan ini digunakan metode GetHistory(n).
Contohnya adalah menampilkan penyebab terjadinya shutdown sebelumnya.
< script runat="server">
Sub Page_Load(sender as Object, e as EventArgs)
dgHistory.DataSource = ProcessModelInfo.GetHistory(10)
dgHistory.DataBind()
End Sub
< /script>
< asp:datagrid id="dgHistory" runat="server" HorizontalAlign="center"
AutoGenerateColumns="False" CellPadding="4">
< HeaderStyle Font-Bold="True" BackColor="#dddddd" />
< Columns>
< asp:boundcolumn HeaderText="Process ID" DataField="ProcessID" />
< asp:boundcolumn HeaderText="Start Time" DataField="StartTime" />
< asp:boundcolumn HeaderText="Peak Memory Used (in KB)"
DataField="PeakMemoryUsed" />
< asp:boundcolumn HeaderText="Shutdown Reason" DataField="ShutdownReason" />
< /Columns>
< /asp:datagrid>
Membuat Image Slide Show
Untuk menampilkan slide show, langkah-langkah yang harus dilakukan :
1.Buatlah directory pada Web Site dan upload image-image yang akan ditampilkan
2.Copy Default.aspx ke directory yang sama dimana image di-upload
Untuk menampilkan image, maka harus dapat mengambil list dari image pada directory tersebut dengan menggunakan class DirectoryInfo pada namespace System.IO
Kemudian gunakan method GetFiles() yang menghasilkan array dari instance FileInfo, setiap instance mengandung informasi tentang setiap file pada directory tersebut.
Potongan program pada Page_Load :
Sub Page_Load(sender as Object, e as EventArgs)
'Mengambil list image
Dim dirInfo as New DirectoryInfo(Server.MapPath(""))
Dim images() as FileInfo = FilterForImages(dirInfo.GetFiles())
...
End Sub
Function FilterForImages() mencari dari array yang di-passingkan dan mengembalikan array dari object FileInfo yang merupakan file image :
Function FilterForImages(images() as FileInfo) as FileInfo()
Dim newImages as New ArrayList(images.Length)
Dim i as Integer
For i = 0 to images.Length - 1
If Path.GetExtension(images(i).Name.ToLower()) = ".jpg" OrElse _
Path.GetExtension(images(i).Name.ToLower()) = ".jpeg" OrElse _
Path.GetExtension(images(i).Name.ToLower()) = ".png" OrElse _
Path.GetExtension(images(i).Name.ToLower()) = ".gif" then
newImages.Add(images(i))
End If
Next
Return CType(newImages.ToArray(GetType(FileInfo)), FileInfo())
End Function
Untuk menampilkan image :
Source Code :
Sub Page_Load(sender as Object, e as EventArgs)
...
'Menentukan image yang akan ditampilkan
Dim imgIndex as Integer = 0
If Not Request.QueryString("N") is Nothing AndAlso _
IsNumeric(Request.QueryString("N")) then
imgIndex = CInt(Request.QueryString("N"))
End If
currentImgTitle.Text = "You are Viewing: " & _
Path.GetFileNameWithoutExtension(images(imgIndex).Name) & _
" (" & imgIndex + 1 & " of " & images.Length & ")"
currentImg.ImageUrl = Path.GetFileName(images(imgIndex).Name)
...
End Sub
HTML Markup :
< asp:Label runat="server" id="currentImgTitle" /> < br />
< asp:Image runat="server" id="currentImg" />
Untuk berpindah antar image ada 2 cara:
1.Dengan hyperlink Next/Previous
2.Dengan list dari semua image pada directory sehingga user dapat dengan cepat berpindah ke image yang diinginkan.
Untuk cara pertama, Next/Previous diimplemetnasikan dengan HyperLink Web Control
Source Code:
Sub Page_Load(sender as Object, e as EventArgs)
...
If imgIndex > 0 then
lnkPrev.NavigateUrl = "Default.aspx?N=" & imgIndex - 1
End If
If imgIndex < images.Length - 1 then
lnkNext.NavigateUrl = "Default.aspx?N=" & imgIndex + 1
End If
...
End Sub
HTML Markup:
< asp:HyperLink runat="server" id="lnkPrev" Text="< Previous" /> |
< asp:HyperLink runat="server" id="lnkNext" Text="Next > " />
Dapat juga menggunakan user untuk berpindah dari ke image yang diinginkan dengan menampilkan list dari semua image sebagai hyperlink
Source Code:
Sub Page_Load(sender as Object, e as EventArgs)
...
dlIndex.DataSource = images
dlIndex.DataBind()
End Sub
Sub dlIndex_ItemDataBound(sender as Object, e as DataListItemEventArgs)
If e.Item.ItemType = ListItemType.Item OrElse _
e.Item.ItemType = ListItemType.AlternatingItem then
'Dapatkan Hyperlink
Dim hl as HyperLink = CType(e.Item.FindControl("lnkPic"), HyperLink)
'Tentukan property Text and Navigation
hl.Text = Path.GetFileNameWithoutExtension(_
DataBinder.Eval(e.Item.DataItem, "Name").ToString()) & _
" (" &