Saturday, June 11, 2005

memassingkan paramater dari stored procedure

Dibawah ini adalah codenya menggunakan contoh sebuah button ketika diklik maka akan memasingkan paramater :

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

Dibawah ini adalah codenya menggunakan contoh sebuah button ketika diklik maka akan memasingkan paramater :

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

Menampilkan record secara ascending atau descending dapat dilakukan oleh user dengan cara:




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

cara menampilkan 10 record terbaru adalah dengan :



<%
DIM mySQL, objRS
mySQL = "SELECT TOP 10 * FROM tblScripts ORDER BY DateEntered DESC"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn
%>



<%
DIM iRecordCount
iRecordCount = 0
DO WHILE NOT objRS.EOFand iRecordCount <> 10
%>


Our Latest Scripts
<%=objRS("Script")%>


<%
iRecordCount = iRecordCount + 1
objRS.MoveNext
Loop

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>

Kuliah Online

menghitung jumlahdari record dengan do.. loop



<%
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

Memberi warna pada row yang ditampilkan



<%
DIM mySQL, objRS
mySQL = "SELECT * FROM tblData"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn, adOpenKeySet



<%
DIM iRecordCount
iRecordCount = 0
DO WHILE NOT objRS.EOF
IF iRecordCount Mod 2 = 0 THEN
%>


<% ELSE %>


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

Contoh dari penggunaan DSN connection:
<%
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

salah satu cara yang paling populer adalah mengirim data dengan CDONTS email component. kita akan menggunakan CDONTS email component untuk mnegirm data dari text box dan a textarea box.

isi dari formpage.asp adalah

""
"
'
'"
"
"
"
"
"
"
"
"
Email:
First Name:
Last Name:
Subject:
Comments:

"
"


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

Salah satu cara dalam mengupload adalah dengan ASPUpload component
employment.asp isisnya:
"

"
"
"
"
"
"
"
"
"
"
"
"
"
"
Email:
First Name:
Last Name:
Position APPlying For:
Resume:
Comments:

"


"
"
"


"
"

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#

Pada project ini, ide utamanya adalah menciptakan sebuah class CreateLogFile, yang akan menciptakan sebuah direktori khusus dari web. Class ini menggunakan 2 namespace:

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

Tree adalah cara mudah untuk mengatur informasi dalam jumlah yang besar. Kita menggunakannya dimana saja, dari directory pada file system dan kategori pada web directoru hingga hirarki di organisasi dan family tree :)

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

Kita dapat menambahkan sebuah kalender popup pada textbox datagrid ketika pada mode edit

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)

Pada artikel ini, akan diciptakan sebuah dataset pada memory dan akan menggunakan Dataset untuk mengisi control Datalist. Code yang terdapat pada listing 1 yang menunjukkan DB class. Method GetDataSet dari class ini menciptakan dan mengembalikan objek dataset

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

Artikel ini akan membahas tampilan highlight baris saat user scroll mouse naik dan turun pada grid. Efek ini dapat diperoleh dengan menggunakan beberapa baris client-side JavaScript, tetapi hal ini tidak perlu dilakukaan karena dengan .NET lebih mudah yaitu dengan mengimplementasikan ItemDataBound event handler dan menambahkan atribut OnMouseOver dan OnMouseOut untuk menangani perubahan warna.

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

Interface yang digunakan dalam sistem rating adalah sebagai berikut :

<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

Salah satu solusi untuk mencegah hacker dalam membobol cookies adalah sebagai berikut:

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#

Ini adalah dynamic photo galeri. Ini mengijinkanmu untuk membuat galerimu tanpa database, tetapi mendapatkan file dari directory dan mengikat mereka pada data list atau data grid setelah menciptakan thumbnail, popup membaca nama image dan ada file XML dimana deskripsi dapat dibaca untuk setiap image.
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

Misalkan kita hendak membuat halaman entry dengan 35 kolom, 10 diantaranya adalah dropdownlist. Maka akan sangat tidak efisien karena terlalu banyak coding, ke database 10 kali untuk mendapatkan nilai untuk DropDownList.

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

Misalkan kita hendak membuat halaman entry dengan 35 kolom, 10 diantaranya adalah dropdownlist. Maka akan sangat tidak efisien karena terlalu banyak coding, ke database 10 kali untuk mendapatkan nilai untuk DropDownList.

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

Cara paling sederhana untuk debugging adalah set Debug="True" yaitu dengan
< @ 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

Method ini digunakan untuk memindahkan semua items dari listbox sumber ke listbox tujuan

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)

Artikel ini mendokumentasikan solusi untuk mengatasi timeout SQL server reporting service, untuk menampilkan report dengan tanggal besar. Solusinya adalah untuk mengkompresi report dengan menggunakan format zip dan mengijinkan user untuk download zip file.
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

Jika ada proses yang membutuhkan waktu lebih dari 20 detik, maka perkembangan proses perlu ditunjukkan sehingga user bisa tahu status dari proses, misalkan bila user menekan tombol untuk mengirimkan email ke 50 orang, maka perlu ditampilkan di layar email apa saja yang keluar sehingga dia bisa tahu proses apa saja yang terjadi

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

Contoh program yang menggunakan PleaseWaitText, PleaseWaitImage, PleaseWaitType

<%@ Page language="C#" %>
<%@ Register TagPrefix="cc1" Namespace="JavaScriptControls"
Assembly="PleaseWaitButton" %>





Testing PleaseWaitButton




Testing the PleaseWaitButton control.



Text="Click me to start a time-consuming process"
PleaseWaitText="Please Wait... "
PleaseWaitImage="pleaseWait.gif"
OnClick="PleaseWaitButton1_Click" />

visible="false">
Thank you for submitting this form. You are truly
the coolest user I've ever had the pleasure of serving.
No, really, I mean it. There have been others, sure,
but you are really in a class by yourself.






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
tag of its own
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

Menggunakan dialog box dalam berbagai aplikasi sangat penting agar terjadi komunikasi yg lebih baik antara user dengan aplikasi tersebut. Dialog antara user dan aplikasi ini bisa meningkatkan usability dari suatu aplikasi.
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.