这几天做了一个本校项目,东北石油大学软件学院主页。其中大量用到了GridView、DataList来进行数据的操作,且必须是纯代码生成,不可以用GridView的绑定数据源(具体因为什么我也不知道,可能是项目合并的时候会有问题),做了几天之后对GridView有点感悟,写出来供大家参考参考,本科生水平 不喜勿喷。
1、GridView实现动态创建数据表
private void Page_Load(object sender, EventArgs e)
{
if(!isPostBack)
Listfile();
}
void ListFile() //加载文件列表——————————————————
{
DataRow row;
DataSet ds = new DataSet();
DataTable dtTable = new DataTable();
ds = BLL.bllWC.BLL_LoadFile(); //获取数据库内容
for (int i = 0; i < ds.Tables[0].Rows.Count; i++) //判断数据库里有几行记录
{
row = dtTable.NewRow();
dtTable.Rows.Add(row); //创造的新表跟数据库里的记录一样多
}
string Head1 = "序号"; //手动创建列名 (可以任意多个)
DataColumn head1 = new DataColumn(Head1);
dtTable.Columns.Add(head1);//加入第一列
string Head2 = "文件名";
DataColumn head2 = new DataColumn(Head2);
dtTable.Columns.Add(head2);//加入第二列
string Head3 = "文件类型";
DataColumn head3 = new DataColumn(Head3);
dtTable.Columns.Add(head3);//加入第三列
string Head4 = "文件大小(KB)";
DataColumn head4 = new DataColumn(Head4);
dtTable.Columns.Add(head4);//加入第四列
for (int i = 0; i < ds.Tables[0].Rows.Count; i++) //循环取出来的表,为自己创建的表添加记录(相当于复制取出来的表 按照你自己想要的列名顺序展示)
{
dtTable.Rows[i][0] = ds.Tables[0].Rows[i][0].ToString();
dtTable.Rows[i][1] = ds.Tables[0].Rows[i][1].ToString();
dtTable.Rows[i][2] = ds.Tables[0].Rows[i][2].ToString();
dtTable.Rows[i][3] = ds.Tables[0].Rows[i][3].ToString();
}
GridView1.DataSource = dtTable;
GridView1.DataBind();
}
2、GridView实现上传文件
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile == true && FileUpload1.PostedFile.ContentLength != 0) // 如果文件有内容
{
string time = DateTime.Now.ToShortDateString(); //上传时间
string path = Server.MapPath("~/upfiles/"); //在网站Web根目录下创建文件夹upfiles存上传的文件
double size = Convert.ToDouble(FileUpload1.PostedFile.ContentLength) / 1024; //文件大小(KB)
string filename, filetype;
filename = FileUpload1.FileName.ToString();
filetype = filename.Substring(filename.LastIndexOf(".") + 1); //获取文件的后缀名
//如果已有此文件,不可重复上传
DataSet ds = BLL.bllWC.BLL_GetAllFilename();
if(ds!=null)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (filename.Equals(ds.Tables[0].Rows[i][0].ToString()))
{
Response.Write("<script>alert('已有文件,不可重复上传!')</script>");
return;
}
}
}
bool aa = BLL.bllWC.BLL_UpFile(size, filename, filetype); //对数据库更新,把上传文件的名字、大小、类型插入进去
if (aa == true)
{
FileUpload1.SaveAs(path + FileUpload1.FileName); //保存到指定的网站根目录下的upfiles文件夹下
BLL.bllWC.BLL_InsertTime(filename,time); //原来数据库设计的没有上传时间,做完之后又新增的,所有这里有插入时间方法 (可以删了)
ListFile();
}
else
{
Response.Write("<script>alert('上传文件失败!')</script>");
ListFile();
}
}
else
{
Response.Write("<script>alert('文件名不存在或者文件为空!')</script>");
}
}
3、GridView实现文件下载
前提:需要在GridView里编辑模板,增加列,增加ButtonField字段,Text和HeaderText设为删除,注意一定要设置行为里的CommandName(我设为了Btn_Click),然后点击GridView的RowCommand方法,进去编写。而且Page_load事件里要有上面的ListFile()方法 加载文件列表。 //如果是别的页面跳转到这个页面进行了传参,只可用IE自带浏览器保存,各个浏览器 迅雷什么的解析URL会有问题(网上搜的)
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
string strFile = Server.MapPath("upfiles/"); //文件存在哪里
string filename = 。。。 //文件名字,自己获取吧,我的你用不了
strFile += filename;
if (e.CommandName == "Btn_Click") //如果确实点击了下载
{
if (!System.IO.File.Exists(strFile))
{
Response.Write("<script language='javascript'>alert('对不起,出错了!');</script>");
return;
}
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "application/octet-stream";
FileInfo fi = new FileInfo(strFile);
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(filename));
Response.AddHeader("Content-Length", fi.Length.ToString());
byte[] tmpbyte = new byte[1024 * 8];
FileStream fs = fi.OpenRead();
int count;
while ((count = fs.Read(tmpbyte, 0, tmpbyte.Length)) > 0)
{
Response.BinaryWrite(tmpbyte);
Response.Flush();
}
fs.Close();
Response.End();
}
}