Newer
Older
GHFX_REFACTOR / FormDocumentManager.cs
wxn on 2 Nov 2016 20 KB 提交
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("请选中需要下载的文件!", "提示");
            }
        }


    }
}