在这篇文章中,我会告诉你如何强化管理界面,并提供给你一个更好使用图像的方法。
图像维护
把图像插入数据表中只是管理数据库的一个方面。另外,用户需要删除或编辑数据,甚至寻找图像的位置。所以,我们通过ASP.NET来建立一个管理界面,允许用户编辑图像数据,删除图像,添加新的图像,以及通过用户输入的字符串来查找图像。在这个界面里,我们会使用DataGrid控件来显示每一条数据。 DataGrid的每一行都将包括以下内容:
· ID: 数据表中为每个图像指定的唯一整数。
· Name: 插入图像时,需要为图像指定名称。这一项通过上传控件得到,所以它的内容是图像的文件名,以及插入时的完整路径。
· Type: 图像所对应的图像类型。
· Size: 图像的大小,单位是字节。
· Description: 由用户输入的图像说明。
· Image: 实际图像将以一个比较小的比例显示在DataGrid中(比例由图像本身决定)。也可以把它看作缩略图(宽50像素,高40像素)。
· Buttons: 每一条数据中都有编辑和删除的按钮。当用户点击编辑按钮时,更新和取消按钮将显示在编辑按钮的位置。更新按钮将所作修改写入数据库并退出编辑模式。取消按钮忽略一切修改,直接退出编辑模式。
另外,DataGrid顶端的添加新图像按钮可以让用户向数据库中添加新的图像。还有一个文本框和搜索按钮让用户可以在数据库中进行搜索。当用户点击搜索按钮时,将在数据库中搜索名称或说明中包含搜索字符串的数据条目。搜索结果将显示在DataGrid中。还有一个清除按钮,用于清除搜索文本框,并将所有数据重新载入DataGrid。
列表A列出了页面的VB.NET代码。
列表A
========
Const connString as String = "Data Source=localhost;Initial
Catalog=Northwind;User Id=username;Password=password;"
Sub Page_Load(sender As Object, e As EventArgs)
If (Not Page.IsPostBack) ThenBindDataSet(String.Empty)
End If
End Sub
Sub BindDataSet(searchString As String)
Dim conn As SqlConnection
Dim comm As SqlCommand
Dim sql As String
If (searchString = String.Empty) Thensql = "SELECT ID, Name,
ContentType, FileSize, Picture, Description " _
"FROM ImageData ORDER BY Name"
Elsesql = "SELECT ID, Name, ContentType, FileSize, Picture, Description
" _
"FROM ImageData WHERE Name Like '%" searchString _
"%' OR Description Like '%" searchString "%' ORDER BY Name"
End If
Tryconn = New SqlConnection(connString)comm = New SqlCommand(sql,
conn)conn.Open()dgImages.DataSource =
comm.ExecuteReader()dgImages.DataBind()
Catch SQLexc As SqlExceptionResponse.Write("Data error occurred: "
amp; SQLexc.ToString())
End Try
End Sub
Function ImageLink(strArgument) as String
Return ("displayImageVB.aspx?id=" & strArgument)
End Function
Sub dgImages_Edit(sender As Object, e As
DataGridCommandEventArgs)dgImages.EditItemIndex =
e.Item.ItemIndexBindDataSet(String.Empty)
End Sub
Sub dgImages_Cancel(sender As Object, e As
DataGridCommandEventArgs)dgImages.EditItemIndex =
-1BindDataSet(String.Empty)
End Sub
Sub dgImages_Update(sender As Object, e As DataGridCommandEventArgs)
Dim strName as String = CType(e.Item.Cells(1).Controls(0),
TextBox).Text
Dim strDesc as String = CType(e.Item.Cells(4).Controls(0),
TextBox).Text
Dim strSQL as String = "UPDATE [ImageData] SET [Name] = '" strName
_
"', [Description] = '" strDesc "' WHERE [ID] = "
e.Item.Cells(0).Text
Dim conn as New SqlConnection(connString)conn.Open()
Dim comm as SqlCommand = new SqlCommand(strSQL, conn)comm.CommandType =
CommandType.Textcomm.ExecuteNonQuery()conn.Close()dgImages.EditItemIndex
= -1BindDataSet(String.Empty)
End Sub
Sub dgImages_Delete(sender As Object, e As DataGridCommandEventArgs)
Dim sql as String sql = "DELETE FROM [ImageData] WHERE [ID] = "
e.Item.Cells(0).Text
Dim conn as New SqlConnection(connString)conn.Open()
Dim comm as SqlCommand = new SqlCommand(sql, conn)comm.CommandType =
CommandType.Textcomm.ExecuteNonQuery()conn.Close()dgImages.EditItemIndex
= -1BindDataSet(String.Empty)
End Sub
Sub AddImage(sender As Object, e As
EventArgs)Response.Redirect("addImage.aspx")
End Sub
Sub DoSearch(sender As Object, e As
EventArgs)BindDataSet(txtSearch.Text)
End Sub
Sub ClearSearch(sender As Object, e As EventArgs)
If Not (txtSearch.Text = "")
ThenBindDataSet(String.Empty)txtSearch.Text = ""
End If
End Sub
'
Runat=server />
列表B 列出了等价的C#代码。
列表B
===============
const string connString = "Data Source=Pentium4;Initial
Catalog=Northwind;User Id=sa;Password=;";
rivate void Page_Load(object sender, System.EventArgs e) {
if (!Page.IsPostBack) {BindDataSet(String.Empty);
} }
ublic void BindDataSet(string searchString)
{SqlConnectionconn;SqlCommandcomm;
tring sql;
if (searchString == String.Empty)sql = "SELECT ID, Name, ContentType,
FileSize, Picture, Description FROM ImageData ORDER BY Name";
elsesql = "SELECT ID, Name, ContentType, FileSize, Picture, Description
FROM ImageData WHERE Name Like '%" searchString "%' OR Description
Like '%" searchString "%' ORDER BY Name";
try {conn = new SqlConnection(connString);comm = new SqlCommand(sql,
conn);conn.Open();dgImages.DataSource =
comm.ExecuteReader();dgImages.DataBind();
} catch (SqlException ex) {Response.Write("Data Error: "
ex.ToString());
} }
ublic string ImageLink(object strArgument) {
return ("displayImageVB.aspx?id=" strArgument.ToString());
}
ublic void dgImages_Edit(Object sender, DataGridCommandEventArgs e)
{dgImages.EditItemIndex = e.Item.ItemIndex;BindDataSet(String.Empty);
}
ublic void dgImages_Cancel(Object sender, DataGridCommandEventArgs e)
{dgImages.EditItemIndex = -1;BindDataSet(String.Empty);
}
ublic void dgImages_Update(Object sender, DataGridCommandEventArgs e)
{
tring strName;
tring strDesc;
tring strSQL;SqlConnectionconn;SqlCommandcomm;strName =
((TextBox)(e.Item.Cells[1].Controls[0])).Text;strDesc =
((TextBox)(e.Item.Cells[4].Controls[0])).Text;strSQL = "UPDATE
[ImageData] SET [Name] = '" strName "', [Description] = '"
trDesc "' WHERE [ID] = " e.Item.Cells[0].Text;conn = new
SqlConnection(connString);conn.Open();comm = new SqlCommand(strSQL,
conn);comm.CommandType =
CommandType.Text;comm.ExecuteNonQuery();conn.Close();dgImages.EditItemIndex
= -1;BindDataSet(String.Empty);
}
ublic void dgImages_Delete(Object sender, DataGridCommandEventArgs e)
{
tring sql;sql = "DELETE FROM [ImageData] WHERE [ID] = "
e.Item.Cells[0].Text;SqlConnectionconn;SqlCommandcomm;conn = new
SqlConnection(connString);conn.Open();comm = new SqlCommand(sql,
conn);comm.CommandType =
CommandType.Text;comm.ExecuteNonQuery();conn.Close();dgImages.EditItemIndex
= -1;BindDataSet(String.Empty);
}
ublic void AddImage(Object sender, EventArgs e)
{Response.Redirect("sqlimagesexample1vb.aspx");
}
ublic void DoSearch(Object sender, EventArgs e)
{BindDataSet(txtSearch.Text);
}
ublic void ClearSearch(Object sender, EventArgs e) {
if (txtSearch.Text != "") {BindDataSet(String.Empty);txtSearch.Text =
"";
} }
'
Runat="server" />
以下是对代码的一些解释:
· DataGrid的OnEditCommand属性将Edit命令 (EditCommandColumn)指定到特定的子程序。对取消编辑的OnCancelCommand,保存修改的OnUpdateCommand,以及删除数据项的OnDeleteCommand也是一样。
· asp:BoundColumn元素在对应的数据集中将DataGrid的列与指定的列连接。DataField属性指定对应的列。
· ASP.NET的按钮控件使搜索和添加新项目更加轻松。它们的OnClick属性可以让你指定一个子程序,当按钮被按下时执行。
· DoSearch子程序在数据表中所有数据项的Description和Name中对搜索字符串进行搜索。搜索结果的各行将在DataGrid中显示。
· ClearSearch方法将所有数据重新载入DataGrid,并清除搜索文本框。
· BindDataSet方法负责将数据载入DataGrid并接受搜索字符串。如果搜索字符串为空,则执行的T-SQL语句中将设定为显示数据表中所有数据。否则,将使用搜索字符串来创建T-SQL语句来取出所有符合搜索字符串的记录,显示在DataGrid中。