这个页面,以DataGrid控件操作为主,全面完成一个列表页面的各种功能,希望能有所益于初学者,如果有不完善的或者错误的地方,还请达者不吝
指正.
功能:
1.用代码创建一个access数据库
2.搜索某文件夹里面的所有文件,提取各文件信息,将信息写到数据库中,并将所有文件拷贝到另外一个文件夹及将文件直接写到数据库中
3.显示数据库中所有文件列表
4.此列表的排序,可正排,也可反排
5.加入分页功能,分页控件用的是本版版主 陕北吴旗娃 的分页控件
6.加入修改功能,同时修改硬盘中的文件
7.加入删除功能,同时删除硬盘中的文件
8.在当前页面加入显示图片功能
9.新开窗口显示图片或文件
10.添加新文件功能,将文件添加到数据库中并且写到硬盘上.
11.在DataGrid控件中,实现合并列功能.
12.完整解决点击"修改"后,页面重新回到顶部的BUG
功能大致如上,代码较多,要分成几个部分才行.
1.前台页面 list.aspx
<HTML>
<HEAD>
<title>list</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<style type="text/css">
BODY { FONT-SIZE: 9pt }
TD { FONT-SIZE: 9pt }
</style>
<script language="javascript">
function GetCookie (name)
{
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen)
{
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
{
return getCookieVal (j);
}
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0)
{
break;
}
}
return null;
}
function getCookieVal (offset)
{
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function SetCookie (name, value)
{
document.cookie = name + "=" + escape (value);
}
//预览文件脚本
function myViewFile(id)
{
document.all("imgview").style.width = "150px";
document.all("imgview").style.height = "100px";
document.all("imgview").src = "view.aspx?id=" + id;
}
</script>
</HEAD>
<body bgColor="#f1f5f5" leftMargin="0" topMargin="0" rightMargin="0" MS_POSITIONING="FlowLayout"
οnlοad="document.body.scrollTop=GetCookie('posy')" οnunlοad="SetCookie('posy',document.body.scrollTop)">
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<asp:Button id="Button1" runat="server" Text="创建数据库"></asp:Button>
<asp:Button id="Button3" runat="server" Text="取硬盘文件形成数据" ToolTip="取硬盘某文件夹下的所有文件信息写入数据库
中"></asp:Button>
<asp:Button id="Button2" runat="server" Text="显示列表"></asp:Button>
<IMG id="imgview" alt="点击预览显示图片" width="0px" height="0px">
<asp:Label id="Label1" runat="server">Label</asp:Label><BR>
<asp:DataGrid id="myGrid" runat="server" AutoGenerateColumns="False" Width="100%" BorderColor="#CCCCCC"
BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="3" AllowSorting="True"
ShowFooter="True">
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#669999"></SelectedItemStyle>
<ItemStyle ForeColor="#000066"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#006699"></HeaderStyle>
<FooterStyle ForeColor="#000066" BackColor="White"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="id" SortExpression="id" ReadOnly="True" HeaderText="ID值">
<HeaderStyle Wrap="False" HorizontalAlign="Center" Width="40px"></HeaderStyle>
<ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
<asp:TemplateColumn SortExpression="filename" HeaderText="原文件名">
<HeaderStyle Wrap="False" Width="100%"></HeaderStyle>
<ItemTemplate>
<%# DataBinder.Eval(Container, "DataItem.filename") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id=filename runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.filename") %>'
Width="100%">
</asp:TextBox><INPUT id="myFile" type="file" runat="server">
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn SortExpression="filenewname" HeaderText="新文件名">
<HeaderStyle Wrap="False" Width="120px"></HeaderStyle>
<ItemTemplate>
<%# DataBinder.Eval(Container, "DataItem.urlfilenewname") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="filenewname" runat="server" Width="100%" Text='<%# DataBinder.Eval(Container,
"DataItem.filenewname") %>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="filesize" SortExpression="filesize" ReadOnly="True" HeaderText="文件大小">
<HeaderStyle Wrap="False" HorizontalAlign="Center" Width="80px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="filemime" SortExpression="filemime" ReadOnly="True" HeaderText="文件mime类型">
<HeaderStyle Wrap="False" Width="120px"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="uploadtime" SortExpression="uploadtime" ReadOnly="True" HeaderText="上传时间">
<HeaderStyle Wrap="False" Width="100px"></HeaderStyle>
</asp:BoundColumn>
<asp:TemplateColumn HeaderText="操作">
<HeaderStyle Wrap="False" HorizontalAlign="Center" Width="80px"></HeaderStyle>
<ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
<HeaderTemplate>
<asp:Button id="butAdd" runat="server" Text="添加文件" CommandName="Add"></asp:Button>
</HeaderTemplate>
<ItemTemplate>
<asp:Button id="butEdit" runat="server" Text="编辑" CommandName="Edit"></asp:Button>
<asp:Button id="butDelete" runat="server" Text="删除" CommandName="Delete"></asp:Button>
<asp:Button id="butView" runat="server" Text="预览" ToolTip="可在本页面预览该文件"></asp:Button>
</ItemTemplate>
<EditItemTemplate>
<asp:Button id="butUpdate" runat="server" Text="保存" CommandName="Update"></asp:Button>
<asp:Button id="butCancel" runat="server" Text="撤销" CommandName="Cancel"></asp:Button>
</EditItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle HorizontalAlign="Left" ForeColor="#000066" BackColor="White" Mode="NumericPages"></PagerStyle>
</asp:DataGrid></FONT>
<webdiyer:AspNetPager id="AspNetPager1" runat="server"></webdiyer:AspNetPager>
</form>
</body>
</HTML>
问题点数:200、回复次数:162
Top
1 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:22:59 得分 0 /// <summary>
/// list 的摘要说明。
/// 由于创建数据库必须用到ADOX,所以你必须添加引用它
/// 对于不同版本的ADO,需要添加不同的引用
/// 请添加引用Microsoft ADO Ext. 2.7 for DDL and Security
/// 请添加引用Microsoft ADO Ext. 2.8 for DDL and Security
/// 之后,并且在页面中using ADOX;
///
/// 关于分页控件的使用方法
/// 你必须下载CSDN论坛 asp.net 版主 陕北吴旗娃 的分页控件
/// 地址如下:
/// http://www.webdiyer.com
/// 或
/// http://www.wqds.gov.cn/webdiyer/files.asp
/// 下载后,或安装,或将其dll文件拷贝到你的项目的BIN目录下
/// 并且,在项目的"解决方案资源管理器"里面,点击"引用",将该DLL文件添加进去
/// 然后,右键点击你的"工具箱","添加/移除项",找到该DLL文件,添加到工具箱里面,出现控件图标
/// 之后就可直接拖到页面中使用
///
/// 必须在当前目录下建立一个tmpfile目录,里面放置少量任意文件
/// 必须在当前目录下建立一个uploadfile目录,以便放置上传文件
///
/// 必须引用如下命名空间
/// using ADOX;
/// using System.IO;
/// using System.Data.OleDb;
/// 存在问题:
/// 1.以ADOX方式创建数据库,虽然使用了null进行清理,但实际上被创建的数据库仍然处在打开状态
/// 如果是成功创建,则在VS重新编译之后,可以结束打开状态
/// 如果是不成功创建,则无论如何不能结束打开状态
/// </summary>
public class list : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected Wuqi.Webdiyer.AspNetPager AspNetPager1;
protected System.Web.UI.WebControls.Button Button3;
protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.DataGrid myGrid;
#region 定义页面级变量
/// <summary>
/// 定义一个页面级变量,表示当前目录下的欲创建的数据库的路径
/// </summary>
private string dbName = "";
/// <summary>
/// 定义要操作的表
/// </summary>
private string dbTable = "uploadtable";
/// <summary>
/// 定义数据库连接
/// </summary>
private System.Data.OleDb.OleDbConnection conn;
protected System.Web.UI.WebControls.Label Label1;
/// <summary>
/// 定义在硬盘上保存上传文件的文件夹名称
/// </summary>
private string uploadFile = "uploadFile";
#endregion 结束定义页面级变量
/// <summary>
/// 页面加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Page_Load(object sender, System.EventArgs e)
{
//每次页面加载均赋予数据库路径变量值
this.dbName = this.Server.MapPath(".") + "//test93.mdb";
if(!this.IsPostBack)
{
try
{
this.myGridBind();
}
catch
{
this.Response.Write("<script>alert('对不起!未找到该数据库,请先建立数据库!');</script>");
}
}
}
Top
2 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:25:27 得分 0 #region 创建ACCESS数据库
/// <summary>
/// 生成一个ACCESS数据库
/// 字段1:ID 自动编号
/// 字段2:filename 原文件名
/// 字段3:filenewname 新文件名(以年月日时分秒加毫秒命名)
/// 字段3:fileSize 文件大小
/// 字段4:fileMime 文件mime类型
/// 字段5:fileblob 存储文件,OLE类型(相应SQLSERVER为IMAGE类型,ORACLE中为BLOB类型
/// 字段6:uploadtime 上传时间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button1_Click(object sender, System.EventArgs e)
{
//检查此数据库,如果已经创建,则删除它
if(File.Exists(dbName) == true)
{
try
{
File.Delete(dbName);
}
catch
{
this.Response.Write("<script>alert('发生意外,无法删除此文件,该文件可能被打开');history.back();</script>");
this.Response.End();
}
}
//创建数据库
ADOX.CatalogClass cat = new ADOX.CatalogClass();
ADOX.TableClass mytab;
try
{
//创建数据库
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName +";");
//创建表
mytab = new ADOX.TableClass();
mytab.ParentCatalog = cat;
mytab.Name = this.dbTable;
//增加一个自动增长的字段
this.add_Columns(cat,mytab,"id","上传文件信息表ID",ADOX.DataTypeEnum.adInteger,0,true);
//添加原文件名字段,文本,50长度
//注意,字段类型文本不能使用adVarChar,否则出错
this.add_Columns(cat,mytab,"filename","原文件名",ADOX.DataTypeEnum.adVarWChar,50);
//添加 新文件名字段,文本,50长度
this.add_Columns(cat,mytab,"filenewname","新文件名",ADOX.DataTypeEnum.adVarWChar,50);
//添加 文件大小字段,数字,0长度
this.add_Columns(cat,mytab,"fileSize","文件大小",ADOX.DataTypeEnum.adInteger,0);
//添加 文件mime类型 字段,文本,50长度
this.add_Columns(cat,mytab,"fileMime","文件mime类型",ADOX.DataTypeEnum.adVarWChar,50);
//添加 OLE类型 字段,OLE,0长度
this.add_Columns(cat,mytab,"fileblob","OLE类型",ADOX.DataTypeEnum.adLongVarBinary,0);
//添加 上传时间 字段,date,0长度
this.add_Columns(cat,mytab,"uploadtime","上传时间",ADOX.DataTypeEnum.adDate,8);
//设置主键
mytab.Keys.Append("PrimaryKey",ADOX.KeyTypeEnum.adKeyPrimary,"id","","");
//添加创建好的表
cat.Tables.Append(mytab);
}
catch(Exception ex)
{
throw ex;
}
finally
{
mytab = null;
cat = null;
//页面转向
this.Response.Write("<script>alert('成功创建数据库及表!');window.location.href='list.aspx';</script>");
this.Response.End();
}
}
/// <summary>
/// 重载,添加ACCESS数据库表字段
/// </summary>
/// <param name="cat">ADOX对象</param>
/// <param name="myTab">要创建字段的表名</param>
/// <param name="columnName">字段名</param>
/// <param name="Description">字段注释</param>
/// <param name="dataType">字段格式</param>
/// <param name="columSize">字段长度</param>
private ADOX.ColumnClass add_Columns(ADOX.CatalogClass cat,ADOX.TableClass myTab,string columnName,string
Description,ADOX.DataTypeEnum dataType,int columSize)
{
return(this.add_Columns(cat,myTab,columnName,Description,dataType,columSize,false));
}
/// <summary>
/// 重载,添加ACCESS数据库表字段
/// </summary>
/// <param name="cat">ADOX对象</param>
/// <param name="myTab">要创建字段的表名</param>
/// <param name="columnName">字段名</param>
/// <param name="Description">字段注释</param>
/// <param name="dataType">字段格式</param>
private ADOX.ColumnClass add_Columns(ADOX.CatalogClass cat,ADOX.TableClass myTab,string columnName,string
Description,ADOX.DataTypeEnum dataType)
{
return(this.add_Columns(cat,myTab,columnName,Description,dataType,0,false));
}
/// <summary>
/// 添加ACCESS数据库表字段
/// </summary>
/// <param name="cat">ADOX对象</param>
/// <param name="myTab">要创建字段的表名</param>
/// <param name="columnName">字段名</param>
/// <param name="Description">字段注释</param>
/// <param name="dataType">字段格式</param>
/// <param name="columSize">字段长度</param>
/// <param name="isAutoIncrement">是否自动编号</param>
private ADOX.ColumnClass add_Columns(ADOX.CatalogClass cat,ADOX.TableClass myTab,string columnName,string
Description,ADOX.DataTypeEnum dataType,int columSize,bool isAutoIncrement)
{
ADOX.ColumnClass myColumn = new ADOX.ColumnClass();
myColumn.ParentCatalog = cat;
//设置字段类型
myColumn.Type = dataType;
//字段名
myColumn.Name = columnName;
//添加注释
myColumn.Properties["Description"].Value = Description;
//添加自动编号
myColumn.Properties["AutoIncrement"].Value = isAutoIncrement;
//添加此字段
myTab.Columns.Append(myColumn,ADOX.DataTypeEnum.adInteger,columSize);
return(myColumn);
}
#endregion 结束创建ACCESS数据库
#region 将硬盘上某文件下文件信息提取并生成到数据库中去
/// <summary>
/// 取硬盘某文件夹下文件,生成数据库列表
/// 并将文件全部写到数据库中去
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button3_Click(object sender, System.EventArgs e)
{
//获取临时文件夹的路径
string tmpFilePath = this.Server.MapPath("tmpfile");
//定义原文件名
string fileName = "";
//定义新文件名
string fileNewName = "";
//定义文件MIME类型
string fileMime = "";
//定义文件大小
int fileSize = 0;
//定义上传时间
DateTime uploadTime ;
//定义文件后缀名
string fileExtension = "";
//定义上传全路径
string myFilePath = "";
//定义读取文件的字节数组
Byte[] myByte;
//定义
System.IO.DirectoryInfo myDir = new DirectoryInfo(tmpFilePath);
if(myDir.Exists == true)
{
System.IO.FileInfo[] myFileAry = myDir.GetFiles();
//检查该文件夹下是否有文件存在
if(myFileAry.Length == 0)
{
this.Response.Write("<script>alert('该文件夹下没有任何文件!');history.back();</script>");
this.Response.End();
}
//循环提取文件夹下每一个文件,提取信息,写入数据库,并将该文件拷贝到上传文件夹.
foreach (FileInfo objFiles in myFileAry)
{
//获取文件全路径
fileName = objFiles.Name;
//获取后缀名
fileExtension = objFiles.Extension;
fileNewName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond.ToString().PadLeft(4,'0') +
fileExtension;
//获取文件mime类型
//应该可以直接从文件中获取Mime类型的,但我不知道如何获取,请识者指教
fileMime = this.get_MimeType(fileExtension);
//获取上传时间
uploadTime = DateTime.Now;
//求取新文件的转移绝对路径
myFilePath = this.Server.MapPath(".") + "//" + this.uploadFile + "//" + fileNewName;
//将原有文件拷贝到新文件夹里面并且改名
objFiles.CopyTo(myFilePath,true);
//获取该文件的二进制内容
myByte = this.get_Byte(myFilePath);
//获取文件大小
fileSize = myByte.Length;
//写入数据库
this.add_Access(fileName,fileNewName,fileMime,fileSize,myByte,uploadTime);
}
}
else
{
this.Response.Write("<script>alert('给定的文件夹tmpfile不存在,请建立');history.back();</script>");
this.Response.End();
}
}
Top
3 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:26:01 得分 0 /// <summary>
/// 添加数据到ACCESS数据库中
/// </summary>
/// <param name="fileName">上传文件名</param>
/// <param name="fileNewName">新上传文件名</param>
/// <param name="fileMime">上传文件mime类型</param>
/// <param name="fileSize">文件大小</param>
/// <param name="fileBlob">所上传的文件转换成的二进制流对象</param>
/// <param name="uploadTime">上传时间</param>
private void add_Access(string fileName,string fileNewName,string fileMime,int fileSize,Byte[]
fileBlob,DateTime uploadTime)
{
//将获取的文件信息及文件写入到数据库中去
//打开数据库
this.conn_Open();
try
{
//用参数方式写入数据库
OleDbCommand myComm = this.conn.CreateCommand();
//定义SQL语句
string sql = "insert into " + this.dbTable +
"(filename,filenewname,filesize,filemime,fileblob,uploadtime) " +
" values(@filename,@filenewname,@filesize,@filemime,@fileblob,@uploadtime)";
myComm.CommandText = sql;
myComm.Parameters.Add("@filename",OleDbType.VarWChar).Value = fileName;
myComm.Parameters.Add("@filenewname",OleDbType.VarWChar).Value = fileNewName;
myComm.Parameters.Add("@filesize",OleDbType.Integer).Value = fileSize;
myComm.Parameters.Add("@filemime",OleDbType.VarWChar).Value = fileMime;
myComm.Parameters.Add("@fileblob",OleDbType.LongVarBinary,fileBlob.Length).Value = fileBlob;
myComm.Parameters.Add("@uploadtime",OleDbType.DBDate).Value = uploadTime;
//写入数据库
myComm.ExecuteNonQuery();
}
catch(Exception ex)
{
throw ex;
}
finally
{
//关闭数据库
this.conn_Close();
}
}
/// <summary>
/// 根据文件路径及名称获取该文件的流
/// </summary>
/// <param name="filePathName">文件路径及名称</param>
/// <returns>返回Byte[]</returns>
private Byte[] get_Byte(string filePathName)
{
//以二进制方式读取该文件,并写到Byte[]里面
System.IO.FileStream myfs = new System.IO.FileStream
(filePathName,System.IO.FileMode.Open,System.IO.FileAccess.Read);
Byte[] Buffer = new byte[myfs.Length];
myfs.Read(Buffer,0,Buffer.Length);
return(Buffer);
}
/// <summary>
/// 根据文件后缀名获取文件的mime类型
/// </summary>
/// <param name="fileExtension">文件后缀名</param>
/// <returns>返回该文件的mime类型</returns>
private string get_MimeType(string fileExtension)
{
string mystr = "";
switch(fileExtension)
{
case ".gif":
mystr = "image/gif";
break;
case ".jpg":
case ".jpeg":
mystr = "image/jpeg";
break;
case ".bmp":
mystr = "image/bmp";
break;
case ".gz":
mystr = "application/x-gzip";
break;
case ".htm":
case ".html":
mystr = "text/html";
break;
case ".tar":
mystr = "application/x-tar";
break;
case ".zip":
mystr = "application/zip";
break;
case ".rar":
mystr = "image/rar";
break;
case ".doc":
mystr = "application/msword";
break;
case ".xls":
mystr = "application/vnd.ms-excel";
break;
case ".ppt":
mystr = "application/vnd.ms-powerpoint";
break;
default:
mystr = "application/octet-stream";
break;
}
return(mystr);
}
#endregion 结束将硬盘上某文件下文件信息提取并生成到数据库中去
Top
4 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:26:21 得分 0 #region 打开ACCESS数据库,与关闭数据库
/// <summary>
/// 打开数据库连接
/// </summary>
private void conn_Open()
{
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName +";";
this.conn = new OleDbConnection(connString);
this.conn.Open();
}
/// <summary>
/// 关闭数据库
/// </summary>
private void conn_Close()
{
if(this.conn != null)
{
this.conn.Close();
this.conn = null;
}
}
#endregion 结束打开ACCESS数据库
/// <summary>
/// 显示DATAGRID列表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button2_Click(object sender, System.EventArgs e)
{
this.myGridBind();
//写入ViewState,以控制排序
this.setViewState("id","asc");
}
/// <summary>
/// 以ViewState控制排序,写入排序字段名及排序方式
/// </summary>
private void setViewState(string orderByName,string orderByType)
{
ViewState["orderByName"] = orderByName;
ViewState["orderByType"] = orderByType;
}
/// <summary>
/// 绑定datagrid控件
/// </summary>
private void myGridBind()
{
this.myGridBind(false);
}
/// <summary>
/// 绑定datagrid控件
/// </summary>
/// <param name="editType">编辑类型,0/1,普通编辑/添加记录</param>
private void myGridBind(bool bolAdd)
{
string sql = "";
//监测当前的排序状况
if(this.ViewState["orderByName"] == null)
{
ViewState["orderByName"] = "id";
ViewState["orderByType"] = "asc";
}
//获取当前ViewState中保存的排序
string orderByName = this.ViewState["orderByName"].ToString();
string orderByType = this.ViewState["orderByType"].ToString();
//绑定DATAGRID
//此处改用新文件名做为打开文件的链接对象,
//原文件名将取出来作为删除提示,如果带链接会有其他影响
sql = "select id," +
" '<a href=view.aspx?id=' & id & ' target=_blank title=点击可打开查看该文件>' & filenewname & '</a>'
as urlfilenewname ," +
" filename," +
" filenewname," +
" filemime," +
" filesize," +
" fileblob," +
" uploadtime " +
" from " + this.dbTable + "";
sql += " order by " + orderByName + " " + orderByType ;
DataTable myTab = this.myPageBind(this.AspNetPager1,sql,10);
//判断是否添加记录,是则将获取到的DATATABLE在首行添加一条新记录
if(bolAdd == true)
{
myTab.Rows.InsertAt(myTab.NewRow(),0);
}
///绑定控件
this.myGrid.DataSource = myTab;
this.myGrid.DataKeyField = "id";
this.myGrid.DataBind();
//为删除按钮添加脚本事件
int i = 0;
int mycount = this.myGrid.Items.Count;
string filename = "";
string myKeyid = "";
//循环添加
for(i = 0;i<mycount;i++)
{
//为防止在编辑状态时,删除按钮不存在,做一个判断
if(this.myGrid.Items[i].ItemType == ListItemType.Item || this.myGrid.Items[i].ItemType ==
ListItemType.AlternatingItem)
{
//取出该行的文件名,当前文件名在第2列
DataBoundLiteralControl myText = (DataBoundLiteralControl)(this.myGrid.Items[i].Cells[1].Controls[0]);
filename = myText.Text.Trim();
//绑定删除按钮脚本事件
Button butDelete = (Button)this.myGrid.Items[i].FindControl("butDelete");
butDelete.Attributes.Add("onclick","return(confirm('确认要删除文件 [" + filename + "] 吗?'));");
//绑定预览按钮脚本事件
//求取键值
myKeyid = this.myGrid.DataKeys[i].ToString();
Button butView = (Button)this.myGrid.Items[i].FindControl("butView");
butView.Attributes.Add("onclick","myViewFile('" + myKeyid + "');return(false);");
}
}
}
/// <summary>
/// 分页控件绑定,返回数据集
/// </summary>
/// <param name="myPager">分页控件对象</param>
/// <param name="sql">要分页的SQL语句</param>
/// <param name="myPageSize">每页中要显示的行数</param>
public DataTable myPageBind(Wuqi.Webdiyer.AspNetPager myPager,string sql,int myPageSize)
{
//求取记录总数
int mycount = Convert.ToInt32(this.getOneValue("select count(*) from (" + sql + ")"));
myPager.RecordCount = mycount;
//定义分页数量
myPager.PageSize = myPageSize;
//设置分页控件属性
//自定义信息存放位置
myPager.ShowCustomInfoSection = Wuqi.Webdiyer.ShowCustomInfoSection.Left;
//索引文本框显示方式
myPager.ShowInputBox = Wuqi.Webdiyer.ShowInputBox.Always;
//分页信息存放位置
myPager.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Right;
//显示几个页脚数量
myPager.NumericButtonCount = 8;
//是否一定显示分页控件
myPager.AlwaysShow = true;
//使用页面提交方式
myPager.UrlPaging = false;
//不折行
myPager.Wrap = false;
//回到首页
myPager.FirstPageText = "首页";
//回到上一页
myPager.PrevPageText = "上一页";
//下一页
myPager.NextPageText = "下一页";
//最后页
myPager.LastPageText = "最后页";
//以下设定用户自定义记录信息
myPager.CustomInfoText = "第<font color='red'><b>" + myPager.CurrentPageIndex.ToString() +
"</b></font>页/共<font color='blue'><b>" + myPager.PageCount.ToString() +
"</b></font>页 每页<font color='blue'><b>" + myPager.PageSize.ToString() +
"</b></font>条/共<font color='blue'><b>" + myPager.RecordCount.ToString() +
"</b></font>条";
//根据分页数量绑定分页控件
DataTable myTab = new DataTable();
myTab = this.getTable(sql,(myPager.PageSize * (myPager.CurrentPageIndex - 1)), myPager.PageSize);
return(myTab);
}
#region 数据库操作部分
/// <summary>
/// 根据SQL语句获取数据集,主要提供分页控件使用
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="intStart">从第N条记录开始取值</param>
/// <param name="intCount">需要取出的记录数</param>
/// <returns>返回DataTable数据库</returns>
private DataTable getTable(string sql,int intStart,int intCount)
{
//打开数据库
this.conn_Open();
OleDbDataAdapter myAdp = new OleDbDataAdapter(sql, this.conn);
DataSet myDateSet = new DataSet();
try
{
myAdp.Fill(myDateSet,intStart, intCount, "MyPageDataTable");
return(myDateSet.Tables[0]);
}
catch(Exception ex)
{
throw ex;
}
finally
{
//关闭数据库
this.conn_Close();
}
}
/// <summary>
/// 根据SQL语句获取数据集
/// </summary>
/// <param name="sql">SQL语句</param>
/// <returns>返回DataTable数据库</returns>
private DataTable getTable(string sql)
{
//打开数据库
this.conn_Open();
OleDbDataAdapter myAdp = new OleDbDataAdapter(sql, this.conn);
DataSet myDateSet = new DataSet();
try
{
myAdp.Fill(myDateSet , "MyPageDataTable");
return(myDateSet.Tables[0]);
}
catch(OleDbException ex)
{
throw ex;
}
finally
{
//关闭数据库
this.conn_Close();
}
}
/// <summary>
/// 根据SQL语句返回此SQL中包含的数据的第一行第一列值
/// </summary>
/// <param name="sql">要取值的SQL语句</param>
/// <returns>返回第一行第一列值</returns>
public string getOneValue(string sql)
{
//打开数据库
this.conn_Open();
OleDbCommand comm = this.conn.CreateCommand();
comm.CommandText = sql;
try
{
Object myObj = comm.ExecuteScalar();
try
{
return(myObj.ToString());
}
catch
{
return("");
}
}
catch(OleDbException ex)
{
throw ex;
}
finally
{
//关闭数据库
this.conn_Close();
}
}
/// <summary>
/// 根据SQL语句,对数据库进行操作
/// </summary>
public void DoSql(string sql)
{
//打开数据库
this.conn_Open();
try
{
OleDbCommand myComm = this.conn.CreateCommand();
myComm.CommandText = sql;
myComm.ExecuteNonQuery();
}
catch (OleDbException ex)
{
throw(ex);
}
finally
{
//关闭数据库
this.conn_Close();
}
}
#endregion 结束数据库操作部分
Top
5 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:27:49 得分 0
#region 页面控件的各种操作事件
/// <summary>
/// 更新数据
/// </summary>
/// <param name="e"></param>
private void myUpdate(System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int myIndex = e.Item.ItemIndex;
//更新主要只能对原文件名及现文件名做修改,所以只修改此处
//找到原文件名对象
TextBox filename = (TextBox)this.myGrid.Items[myIndex].FindControl("filename");
//找到新文件名对象
TextBox filenewname = (TextBox)this.myGrid.Items[myIndex].FindControl("filenewname");
string sql = "";
//求取当前键值
string myKeyid = this.myGrid.DataKeys[myIndex].ToString();
//求取当前记录,以判断新文件名是否被修改,如果是,需要相应更新硬盘上文件名称
sql = "select filenewname from " + this.dbTable + " where id = " + myKeyid;
string oldFileNewName = this.getOneValue(sql);
try
{
//根据修改结果,更新现有硬盘上的文件
if(oldFileNewName.Equals(filenewname.Text) == false)
{
//求取原硬盘上的文件
string myFilePath = this.Server.MapPath(".") + "//" + this.uploadFile + "//" + oldFileNewName;
//求取更改后的文件名地址
string myNewFilePath = this.Server.MapPath(".") + "//" + this.uploadFile + "//" + filenewname.Text;
//如果原文件仍存在,则修改文件名
if(File.Exists(myFilePath) == true)
{
File.Move(myFilePath,myNewFilePath);
}
}
//根据修改的结果,更新数据库
sql = "update " + this.dbTable + " set " +
" filename = '" + filename.Text + "' , " +
" filenewname = '" + filenewname.Text + "' " +
" where id = " + myKeyid ;
this.DoSql(sql);
}
catch
{
this.Response.Write("<script>alert('对不起!更新失败!请检查数据.');history.back();</script>");
this.Response.End();
}
finally
{
//撤销编辑状态
this.myGrid.EditItemIndex = -1;
//重新绑定
this.myGridBind();
}
}
/// <summary>
/// 添加数据
/// </summary>
/// <param name="e"></param>
private void myAddDate(System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int myIndex = e.Item.ItemIndex;
//定义各变量
string fileName = "";
string fileNewName = "";
string fileMime = "";
string fileExtension = "";
int fileSize = 0;
Byte[] fileBlob;
DateTime uploadTime;
string myFilePath = this.Server.MapPath(".") + "//" + this.uploadFile + "//";
string tmpFileName = "";
System.Web.HttpPostedFile myPostFile = this.Request.Files[0];
if(myPostFile.ContentLength != 0)
{
tmpFileName = myPostFile.FileName;
fileName = tmpFileName.Substring(tmpFileName.LastIndexOf("//") + 1);
//获取文件后缀名
fileExtension = fileName.Substring(fileName.LastIndexOf("."));
//求取新文件名
fileNewName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond.ToString().PadLeft(4,'0') +
fileExtension;
//mime
fileMime = myPostFile.ContentType;
//文件大小
fileSize = myPostFile.ContentLength;
//上传时间
uploadTime = DateTime.Now;
//新文件保存路径
myFilePath += fileNewName;
//将文件保存到硬盘
myPostFile.SaveAs(myFilePath);
//求取该文件的二进制流
fileBlob = this.get_Byte(myFilePath);
//保存数据到数据库中
this.add_Access(fileName,fileNewName,fileMime,fileSize,fileBlob,uploadTime);
}
//添加记录完成,重新绑定
this.myGrid.EditItemIndex = -1;
this.myGridBind();
//为防止刷新页面重复添加记录,执行如下脚本
//但执行之后,页面将回到第一页,不会保持页面状态.
this.Response.Write("<script>alert('成功添加数据');window.location.href=window.location.href;</script>");
}
/// <summary>
/// 更新事件
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int myIndex = e.Item.ItemIndex;
//求取当前键值
string myKeyid = this.myGrid.DataKeys[myIndex].ToString();
//根据键值求取是更新数据还是添加数据
//无键值则为添加数据
if(myKeyid != "")
{
this.myUpdate(e);
}
else
{
this.myAddDate(e);
}
}
/// <summary>
/// 排序
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
this.setViewState(e.SortExpression,this.ViewState["orderByType"].ToString() == "asc"?"desc":"asc");
this.myGridBind();
}
/// <summary>
/// 当单击 DataList 控件中的任一按钮时发生
/// 主要在点击添加时执行
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName == "Add")
{
//如果是添加记录,则传递true参数给编辑过程
this.myEdit(e,true);
}
}
Top
6 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:28:07 得分 0 /// <summary>
/// 进入编辑状态
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//如果是普通编辑,则传递false参数给编辑过程
this.myEdit(e,false);
}
/// <summary>
/// 编辑状态,为添加记录做一定适应
/// </summary>
/// <param name="e"></param>
/// <param name="bolAdd">是否添加记录,true/false,是/否</param>
private void myEdit(System.Web.UI.WebControls.DataGridCommandEventArgs e,bool bolAdd)
{
int myIndex;
if(bolAdd == true)
{
//如果添加,则肯定在第一行
myIndex = 0;
}
else
{
//否则,按当前命令行计算
myIndex = e.Item.ItemIndex;
}
//当前行为编辑行
this.myGrid.EditItemIndex = myIndex;
//重新绑定
this.myGridBind(bolAdd);
//如果是添加记录,则要将当前行改造为上传框
if(bolAdd == true)
{
this.setRemoveCell(e);
//将原输入框置为不可见
TextBox filename = (TextBox)this.myGrid.Items[myIndex].FindControl("filename");
filename.Style.Add("display","none");
//将上传文件框宽度设为100%
System.Web.UI.HtmlControls.HtmlInputFile myFile = (HtmlInputFile)this.myGrid.Items[myIndex].FindControl("myFile");
myFile.Style.Add("width","100%");
}
else
{
//将上传文件框置为不可见
System.Web.UI.HtmlControls.HtmlInputFile myFile = (HtmlInputFile)this.myGrid.Items[myIndex].FindControl("myFile");
myFile.Style.Add("display","none");
}
}
/// <summary>
/// 在添加记录时,将列重新改造,添加上传框
/// </summary>
private void setRemoveCell(System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//只有添加时才有此动作,因此当前行数为0
int myIndex = 0;
int mycount = this.myGrid.Columns.Count;
//必须倒着移除多余的列
for(int i=mycount-2;i>1;i--)
{
this.myGrid.Items[myIndex].Cells.RemoveAt(i);
}
//当前剩余两列,一列放上传控件,一列原操作按钮
//将第1列的占列设置为总列数-2
this.myGrid.Items[myIndex].Cells[1].ColumnSpan = mycount -2;
}
/// <summary>
/// 删除事件
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string sql = "";
int myIndex = e.Item.ItemIndex;
string myKeyid = this.myGrid.DataKeys[e.Item.ItemIndex].ToString();
string filenewname = this.myGrid.Items[myIndex].Cells[2].Text;
try
{
//删除数据库中的记录
sql = "delete * from " + this.dbTable + " where id = " + myKeyid;
this.DoSql(sql);
//求取当前行的文件名
string myFilePath = this.Server.MapPath(".") + "//" + this.uploadFile + "//" + filenewname;
//删除硬盘文件
if(File.Exists(myFilePath) == true)
{
File.Delete(myFilePath);
}
}
catch
{
this.Response.Write("<script>alert('对不起!删除失败!请检查数据.');history.back();</script>");
this.Response.End();
}
finally
{
this.myGrid.EditItemIndex = -1;
this.myGridBind();
}
}
/// <summary>
/// 撤销事件
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void myGrid_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//将编辑行置为-1,取消编辑
this.myGrid.EditItemIndex = -1;
//重新绑定
this.myGridBind();
}
/// <summary>
/// 点击分页事件
/// </summary>
/// <param name="src"></param>
/// <param name="e"></param>
private void AspNetPager1_PageChanged(object src, Wuqi.Webdiyer.PageChangedEventArgs e)
{
//将分页控件的当前页,改为新的页
this.AspNetPager1.CurrentPageIndex = e.NewPageIndex;
//重新绑定
this.myGridBind();
}
#endregion 结束页面控件的各种操作事件
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button3.Click += new System.EventHandler(this.Button3_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.myGrid.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myGrid_ItemCommand);
this.myGrid.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myGrid_CancelCommand);
this.myGrid.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myGrid_EditCommand);
this.myGrid.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.myGrid_SortCommand);
this.myGrid.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myGrid_UpdateCommand);
this.myGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myGrid_DeleteCommand);
this.AspNetPager1.PageChanged += new Wuqi.Webdiyer.PageChangedEventHandler(this.AspNetPager1_PageChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
Top
7 楼clkun(我来是学习)回复于 2005-05-18 16:30:07 得分 2发个邮件好吗? clkun@21cn.com
Top
8 楼acco(天天)回复于 2005-05-18 16:30:21 得分 2好看看.
Top
9 楼hchxxzx(NET?摸到一点门槛)回复于 2005-05-18 16:37:48 得分 0 下面这个是一个配套的显示图片页面.
建立一个页面名为view.aspx,前台什么都不要写,后台如下:
/// <summary>
/// 定义数据库连接
/// </summary>
private System.Data.OleDb.OleDbConnection conn;
/// <summary>
/// 定义一个页面级变量,表示当前目录下的欲创建的数据库的路径
/// </summary>
private string dbName = "";
/// <summary>
/// 定义要操作的表
/// </summary>
private string dbTable = "uploadtable";
private void Page_Load(object sender, System.EventArgs e)
{
//每次页面加载均赋予数据库路径变量值
this.dbName = this.Server.MapPath(".") + "//test93.mdb";
string id = this.Request.QueryString["id"];
if(id == "")
{
this.Response.Write("该文件不存在!");
this.Response.End();
}
//打开数据库
this.conn_Open();
try
{
OleDbCommand myCommand = this.conn.CreateCommand();
string sql = "select fileblob,filemime from " + this.dbTable + " where id = " + id;
myCommand.CommandText = sql;
OleDbDataReader myRead = myCommand.ExecuteReader();
//开始读取
if(myRead.Read() == true)
{
Byte[] Buffer = (Byte[])myRead[0];
//输出
this.Response.Clear();
this.Response.ContentType = myRead[1].ToString();
this.Response.BinaryWrite(Buffer);
this.Response.End();
}
else
{
this.Response.Write("该文件不存在!");
this.Response.End();
}
}
catch(OleDbException ex)
{
throw ex;
}
finally
{
//关闭数据库
this.conn_Close();
}
}
#region 打开ACCESS数据库,与关闭数据库
/// <summary>
/// 打开数据库连接
/// </summary>
private void conn_Open()
{
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName +";";
this.conn = new OleDbConnection(connString);
this.conn.Open();
}
/// <summary>
/// 关闭数据库
/// </summary>
private void conn_Close()
{
if(this.conn != null)
{
this.conn.Close();
this.conn = null;
}
}
#endregion 结束打开ACCESS数据库