using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DevComponents.DotNetBar; using System.Data.OracleClient; using System.IO; using System.Configuration; using System.Threading; using System.Runtime.InteropServices; namespace Cyberpipe { public delegate void ChangeCursor(); public partial class FormDocumentManager : Office2007Form { public event ChangeCursor changeCursor; int maxPageIndex = 10; int rows = 0; public static bool IS_OPEN = false; [DllImport("kernel32.dll")] public static extern IntPtr _lopen(string lpPathName, int iReadWrite); [DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr hObject); public readonly IntPtr HFILE_ERROR = new IntPtr(-1); public const int OF_READWRITE = 2; public const int OF_SHARE_DENY_NONE = 0x40; public FormDocumentManager() { InitializeComponent(); winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged); this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnEditSelected); //预览 //this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnAddNew);//下载 this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);//下载 this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);//删除 this.winGridViewPager1.OnStartExport += new EventHandler(pager1_OnStartExport); this.winGridViewPager1.OnEndExport += new EventHandler(pager1_OnEndExport); winGridViewPager1.dataGridView1.MultiSelect = false; } static FormDocumentManager frm; public static void ShowForm() { if (frm == null) { frm = new FormDocumentManager(); //frm.waitpicBox.Show(); frm.Show(); } else { if (frm.WindowState == FormWindowState.Minimized) { frm.WindowState = FormWindowState.Normal; } } } /// <summary> /// 初始化分页表格 /// </summary> private void initlizeDatagrid() { this.Invoke((EventHandler)delegate { //控制表格显示的列,以及每一列要显示的列名 this.winGridViewPager1.Dock = DockStyle.Fill; this.winGridViewPager1.dataGridView1.Dock = DockStyle.Fill; this.winGridViewPager1.AddColumnAlias("文档名称", "文档名称"); this.winGridViewPager1.AddColumnAlias("编号", "编号"); this.winGridViewPager1.AddColumnAlias("文档标题", "文档标题"); this.winGridViewPager1.AddColumnAlias("文档类型", "文档类型"); this.winGridViewPager1.AddColumnAlias("上传日期", "上传日期"); this.winGridViewPager1.AddColumnAlias("上传人", "上传人"); this.winGridViewPager1.DisplayColumns = "文档名称,文档标题,文档类型,上传日期,上传人"; winGridViewPager1.BackColor = Color.LightCyan;//间隔颜色 //隐藏右键功能按钮 winGridViewPager1.dataGridView1.ContextMenuStrip.Items[4].Visible = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[5].Visible = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[6].Visible = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[7].Visible = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[2].Visible = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[1].Text = "下载"; //winGridViewPager1.dataGridView1.ContextMenuStrip.Items[2].Text = "预览"; winGridViewPager1.dataGridView1.ContextMenuStrip.Items[3].Text = "删除"; //右键菜单宽度 winGridViewPager1.dataGridView1.ContextMenuStrip.AutoSize = false; winGridViewPager1.dataGridView1.ContextMenuStrip.Width = 180; //数据铺满表格 this.winGridViewPager1.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //控制间隔的颜色 winGridViewPager1.BackColor = Color.LightCyan;//间隔颜色 //控制每页显示的最大数据量 winGridViewPager1.PagerInfo.RecordCount = rows; winGridViewPager1.PagerInfo.PageSize = maxPageIndex; winGridViewPager1.dataGridView1.Refresh(); //winGridViewPager1.Controls.RemoveAt(1); }); } /// <summary> /// 页面刷新 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void winGridViewPager1_OnPageChanged(object sender, EventArgs e) { LoadData(); } void pager1_OnEndExport(object sender, EventArgs e) { } void pager1_OnStartExport(object sender, EventArgs e) { int pageIndex = winGridViewPager1.PagerInfo.CurrenetPageIndex; string where = GetSql(); DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, where).Tables[0]; this.winGridViewPager1.AllToExport = table; } /// <summary> /// 预览 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> //private void winGridViewPager1_OnAddNew(object sender, EventArgs e) //{ // progressBar1.Visible = true; // progressBar1.Value = 0; // Thread preViewJob = new Thread(new ParameterizedThreadStart(doPreView)); // preViewJob.IsBackground = true; // preViewJob.Start(e); //} /// <summary> /// 下载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void winGridViewPager1_OnEditSelected(object sender, EventArgs e) { progressBar1.Visible = true; progressBar1.Value = 0; Thread downloadJob = new Thread(new ParameterizedThreadStart(doDownload)); downloadJob.IsBackground = true; downloadJob.Start(e); } /// <summary> /// 删除 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e) { DataGridView grid = sender as DataGridView; if (grid != null && grid.SelectedRows.Count > 0) { DataGridViewRow row = grid.SelectedRows[0]; string dbid = row.Cells["编号"].Value.ToString(); try { if (MessageBox.Show("确认删除吗?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string sql = "delete from casic_userdocument where dbid=" + dbid; OracleUtils.ExecuteNonQuery(OracleUtils.ConnectionString, CommandType.Text, sql); LoadData(1); MessageBox.Show("删除成功!", "结果", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) { MessageBox.Show("删除失败:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("没有选择记录", "提示"); } } private void LoadData() { int pageIndex = winGridViewPager1.PagerInfo.CurrenetPageIndex; string sqlData = GetSql(pageIndex); initlizeDatagrid(); DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, sqlData).Tables[0]; winGridViewPager1.DataSource = table.DefaultView; winGridViewPager1.Refresh(); } private void LoadData(int pageIndex) { string sqlData = GetSql(pageIndex); initlizeDatagrid(); DataTable table = OracleUtils.ExecuteDataset(OracleUtils.ConnectionString, CommandType.Text, sqlData).Tables[0]; this.Invoke((EventHandler)delegate { winGridViewPager1.DataSource = table.DefaultView; winGridViewPager1.Refresh(); }); } private string GetSql() { string sqlCount = "select count(*) from casic_userdocument where sysname = 'GHFX'"; string sqlData = "select filename as 文档名称,dbid as 编号,title as 文档标题," + "filetype as 文档类型,upday as 上传日期,writer as 上传人 " + "from (select t.*,rownum row_num from casic_userdocument t order by DBID desc)b " + " where sysname = 'GHFX'"; rows = int.Parse(OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount).ToString()); return sqlData; } private string GetSql(int pageIndex) { int minPage = (pageIndex - 1) * maxPageIndex + 1; int maxPage = pageIndex * maxPageIndex; string sqlCount = "select count(*) from casic_userdocument where sysname = 'GHFX'"; string sqlData = "select filename as 文档名称,dbid as 编号,title as 文档标题," + "filetype as 文档类型,upday as 上传日期,writer as 上传人 " + "from (select t.*,rownum row_num from casic_userdocument t where sysname = 'GHFX'"; string txtTitleText = null; string comboFileType = null; string comboWriter = null; string dateTimeBegin = null; string dateTimeEnd = null; this.Invoke((EventHandler)delegate { txtTitleText = txt_title.Text.Trim(); comboFileType = combo_file_type.Text.Trim(); ; comboWriter = combo_writer.Text.Trim(); if (dateTime_begin.Value != null) { dateTimeBegin = dateTime_begin.Value.ToShortDateString(); } if (dateTime_end.Value != null) { DateTime time = dateTime_end.Value; time.AddDays(1); dateTimeEnd = time.ToShortDateString(); } }); if (!String.IsNullOrEmpty(txtTitleText)) { sqlData += " and title like '%" + txtTitleText + "%'"; sqlCount += " and title like '%" + txtTitleText + "%'"; } if (dateTimeBegin != null) { sqlData += " and upday>=to_date('" + dateTimeBegin + "','yyyy-MM-dd')"; sqlCount += " and upday>=to_date('" + dateTimeBegin + "','yyyy-MM-dd')"; } if (dateTimeEnd != null) { sqlData += " and upday<=to_date('" + dateTimeEnd + "','yyyy-MM-dd')"; sqlCount += " and upday<=to_date('" + dateTimeEnd + "','yyyy-MM-dd')"; } if (!String.IsNullOrEmpty(comboFileType)) { sqlData += " and filetype='" + comboFileType + "'"; sqlCount += " and filetype='" + comboFileType + "'"; } if (!String.IsNullOrEmpty(comboWriter)) { sqlData += " and writer='" + comboWriter + "'"; sqlCount += " and writer='" + comboWriter + "'"; } sqlData += " order by upday desc)b " + "where(b.row_num between " + minPage + " and " + maxPage + ")"; rows = int.Parse(OracleUtils.ExecuteScalar(OracleUtils.ConnectionString, CommandType.Text, sqlCount).ToString()); return sqlData; } static readonly object lockHelp = new object(); /// <summary> /// 下载远程文件,并显示进度条 /// 如果本地存在相同文件,且文件未在使用,则删除后进行下载 /// 如果本地文件处于打开状态,则不进行下载。 ///返回值:0:表示下载成功,1:表示正在下载中,2:表示下载出现异常,3:网络异常 /// </summary> public int DownloadFile(string URL, string filename, ProgressBar prog) { System.Net.ServicePointManager.DefaultConnectionLimit = 1000; // lock (lockHelp) // { string vFileName = @filename; if (File.Exists(vFileName)) {//文件存在 IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE); if (vHandle == HFILE_ERROR) {//文件被占用,说明已经有点击,返回即可 CloseHandle(vHandle); return 1; } else { //文件没有被占用,直接删除,以后优化可以判断如果文件和要下载的一直,则直接忽略下面步骤,如果不一致再删除。 CloseHandle(vHandle); File.Delete(vFileName); } } int flag = 0; float percent = 0; System.IO.Stream st=null; System.IO.Stream so=null; System.Net.HttpWebRequest Myrq=null ; //Myrq.Timeout = 10000; System.Net.HttpWebResponse myrp=null; try { Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); Myrq.KeepAlive = false; Myrq.Method = "GET"; Myrq.AllowAutoRedirect = true; myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); long totalBytes = myrp.ContentLength; if (prog != null) { this.Invoke((EventHandler)delegate { prog.Maximum = (int)totalBytes; }); } st = myrp.GetResponseStream(); so = new System.IO.FileStream(filename, System.IO.FileMode.Create); long totalDownloadedByte = 0; byte[] by = new byte[1024000]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { totalDownloadedByte = osize + totalDownloadedByte; System.Windows.Forms.Application.DoEvents(); so.Write(by, 0, osize); if (prog != null) { this.Invoke((EventHandler)delegate { prog.Value = (int)totalDownloadedByte < prog.Maximum ? (int)totalDownloadedByte : prog.Maximum; }); } osize = st.Read(by, 0, (int)by.Length); percent = (float)totalDownloadedByte / (float)totalBytes * 100; System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息 } } catch (System.Net.WebException e) { flag = 3; } catch (System.Exception e) { flag = 2; } finally { if (so != null) { so.Close(); }; if (st != null) { st.Close(); }; if (Myrq != null) { Myrq.Abort(); }; if (myrp != null) { myrp.Close();}; } return flag; // } } private void FormDocumentManager_Load(object sender, EventArgs e) { IS_OPEN = true; changeCursor(); dateTime_end.Value = DateTime.Now; dateTime_begin.Value = DateTime.Now.AddDays(-6); Thread loadThread = new Thread(new ThreadStart(doFormLoad)); loadThread.IsBackground = true; loadThread.Start(); } private void doFormLoad() { LoadData(1); string sql = "select username from casic_userinfotest"; try { using (OracleDataReader reader = OracleUtils.ExecuteReader(OracleUtils.ConnectionString, CommandType.Text, sql)) { this.Invoke((EventHandler)delegate { combo_writer.Items.Add(""); }); while (reader.Read()) { this.Invoke((EventHandler)delegate { combo_writer.Items.Add(reader[0]); }); } } } catch (Exception) { MessageBox.Show("数据库访问异常", "错误"); } //this.Invoke((EventHandler)delegate //{ // this.waitpicBox.Hide(); //}); } private void FormDocumentManager_FormClosing(object sender, FormClosingEventArgs e) { IS_OPEN = false; frm = null; } private void btn_add_Click(object sender, EventArgs e) { FrmDocumentEdit frm = new FrmDocumentEdit(); frm.reloadGrid += new ReloadUserDocumentGrid(LoadData); frm.ShowDialog(); } private void btn_query_Click(object sender, EventArgs e) { LoadData(1); } private void doDownload(Object e) { //下载操作 if (winGridViewPager1 != null && winGridViewPager1.dataGridView1 != null&&winGridViewPager1.dataGridView1.SelectedRows.Count>0) { DataGridViewRow row = winGridViewPager1.dataGridView1.SelectedRows[0]; try { string filename = row.Cells["文档名称"].Value.ToString(); string ext = Path.GetExtension(filename); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "保存文档|*" + ext + ";"; dlg.FilterIndex = 2; dlg.RestoreDirectory = true; bool isClickOk = false;//定义变量方便隔离主线程和子线程的操作 string file = null; string url = ConfigurationManager.AppSettings["downurl"] + "/" + filename; this.Invoke((EventHandler)delegate { if (dlg.ShowDialog() == DialogResult.OK) { isClickOk = true; file = dlg.FileName; } //progressBar1.Visible = false; }); if (isClickOk) { int result = DownloadFile(url, file, progressBar1); if (result == 0) { MessageBox.Show("下载成功!", "提示"); } else { MessageBox.Show("下载失败!", "提示"); } } } catch (Exception ex) { MessageBox.Show("下载失败!", "提示"); } } else { MessageBox.Show("请选中需要下载的文件!", "提示"); } } } }