服务端管理工具编写(五)——添加议程和上传会议文件

时间:2021-11-12 13:05:35

添加议程和编辑会议基本资料一个鸟样,需要新建一个窗体,在主窗体的右键菜单启动它。

服务端管理工具编写(五)——添加议程和上传会议文件

如何在主窗口启动就不多说了,上篇博文讲得很清楚了。

在这个新建的窗体中照样添加个全局变量来传递参数,修改构造函数进行赋值

        public string sID;
public AgendaForm(string sMeetingID)
{
sID = sMeetingID;
InitializeComponent();
}
窗体初始化里面读取数据库的议程,并赋值
        private void AgendaForm_Load(object sender, EventArgs e)
{
DataTable DT = MeetingData.MdbData.GetDataTable("select * from Meeting where ID="+sID);
label1.Text = "编辑会议“" + DT.Rows[0]["mName"].ToString().Trim() + "”议程";
textBox1.Text = DT.Rows[0]["mAgenda"].ToString().Trim();
}
注意控件textBox,默认是单行文本框输入,把Multiline属性改为True,就可以输入多行文本了。

点击确定按钮,更新数据库,添加或修改会议议程。

        private void button1_Click(object sender, EventArgs e)//更新数据库,修改会议议程
{
string sAgenda = textBox1.Text.Trim();
if (sAgenda == "")
{
MessageBox.Show("议程内容不能为空!。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
MeetingData.MdbData.SQLCom("Update Meeting set mAgenda='" + sAgenda + "' where ID=" + sID);
if (MessageBox.Show("更新会议议程成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
this.Close();
}
注意的是,数据库中会议议程这个字段(mAgenda)无论是添加还是修改,用的SQL指令都是Update,因为添加会议时候并没有操作这个字段,所以无论添加会议议程还是修改会议议程,这条记录都是存在的,只需更新里面的数据就可以了。

编辑会议议程很简单,就不多说了,接下来讲上传会议文件。和其它功能一样,新建一个窗体,拖一堆需要的控件,上张UI设计图,一看就知道需要什么控件了。

服务端管理工具编写(五)——添加议程和上传会议文件

图中灰色的那个控件是一个dataGridView,和其它一样,使用全局变量来传递参数

        public string sID;
public AddFileForm(string sMeetingID)
{
sID=sMeetingID;
InitializeComponent();
}
为dataGridView加载数据编一个函数,并在窗体的Load事件中执行它,刷新按钮click事件也是执行它。

        private void FileRefresh()//刷新会议文件数据
{
DataTable DT = MeetingData.MdbData.GetDataTable("select mName from Meeting where ID=" + sID);
label1.Text = "会议“" + DT.Rows[0]["mName"] + "”的文件";
DT = MeetingData.MdbData.GetDataTable("Select ID,mTitle, mFileName from MeetingFile where mDelFlag=0 AND mMeetingID=" + sID + " order by ID DESC");
if (DT.Rows.Count > 0)
{
dataGridView1.DataSource = DT;
dataGridView1.RowHeadersWidth = 30;
dataGridView1.Columns[0].Width = 40;
dataGridView1.Columns[0].HeaderText = "编号";
dataGridView1.Columns[1].Width = 322;
dataGridView1.Columns[1].HeaderText = "文件标题";
dataGridView1.Columns[2].Width = 230;
dataGridView1.Columns[2].HeaderText = "文件名";
dataGridView1.AlternatingRowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
label4.Hide();
}
else
dataGridView1.Hide();
}
注意SQL指令里面多了个mDelFlag=0,要在数据库中添加这个字段,用来标志文件是否删除,字段是数据类型是“是/否”。
这个代码是后面编写的,找到了修改dataGridView行头的方法,和主窗体那里重新搞了个DataTable不一样,本来想改掉主窗体的代码的,懒得动就继续保留了。
打开查找文件对话框的方法,就是那个浏览按钮的click事件。

        private void button1_Click(object sender, EventArgs e)//浏览文件查找会议文件
{
OpenFileDialog FileDialog = new OpenFileDialog();
FileDialog.InitialDirectory = @Environment.GetFolderPath(Environment.SpecialFolder.Personal);
FileDialog.Filter = @"PDF文件 (*.PDF)|*.pdf";
if (FileDialog.ShowDialog() == DialogResult.OK)
{
textBox1.Text = FileDialog.FileName;
if (textBox2.Text.Trim() == "")
textBox2.Text = FileDialog.SafeFileName.Substring(0,FileDialog.SafeFileName.Length-4);
}
}
这里就是打开一个查找文件的对话框,使用的是系统默认的对话框,限制只列出PDF文件,每次只能选一个文件,选中文件后把文件地址放在textBox1里面,检查textBox2的内容是不是空,如果是空,把文件名去掉扩展名后放在textBox2里面。

为什么要限制使用PDF文件呢?单位里面负责写材料的基本都是搞成Word文件呀,其实是我没办法呀,Word文件很难用Web的方式打开,要么打开的时候效果异常差,还动不动就变成编辑模式,看会议文件会变成改会议文件的,PDF文件的保护功能就好多了,只能单纯打开来看。还有人说Word里面可以把文档保存成html格式或单文档格式的,但要注意,一旦保存成这些格式,会清除所有排版格式的,异常难看呀。

拷贝文件到指定的文件夹,在IIS目录下新建一个MeetingFile的文件夹,用来保存会议文件。代码其实就是那个添加按钮的click事件

        private void button2_Click(object sender, EventArgs e)//添加新会议文件
{
//获取即将记录入数据库的ID
string sFileID = "1";
DataTable DT = MeetingData.MdbData.GetDataTable("Select Top 1 ID from MeetingFile Order by ID DESC");
if(DT.Rows.Count>0)
sFileID=(Convert.ToInt32( DT.Rows[0]["ID"].ToString())+1).ToString();
byte[] result = Encoding.Default.GetBytes(sFileID);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] output = md5.ComputeHash(result);
sFileID = BitConverter.ToString(output).Replace("-", "")+".pdf";
//校验输入标题和上传文件合法性
if (textBox2.Text.Trim() == "")
{
MessageBox.Show("文件标题不能为空!","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
if (textBox1.Text.Trim() == "")
{
MessageBox.Show("请选择需要上传的会议文件!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string sFileName = textBox1.Text.Trim();
if (sFileName.Substring(sFileName.Length - 4, 4).ToLower() != ".pdf")
{
MessageBox.Show("会议系统仅接受PDF格式文件!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!File.Exists(@sFileName))
{
MessageBox.Show("找不到文件,请确认文件存在!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
File.Copy(sFileName, @MeetingData.MdbData.sIISPath() + @"/MeetingFile/" + @sFileID, true);
string[] sField = { "mTitle", "mFileName", "mMeetingID" };
string[] sValue = { "'" + textBox2.Text.Trim() + "'", "'" + @sFileID + "'", sID };
string sCmd = MeetingData.MdbData.SQLInsert("MeetingFile", sField, sValue);
MeetingData.MdbData.SQLCom(sCmd);
MessageBox.Show("上传会议文件成功,可继续添加会议文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
FileRefresh();
}
注意拷贝后文件的命名方式,先读取最后一条记录的ID,转成数字后+1,就是这条记录的ID值,对整个ID值进行MD5加密,加密后的密文就是文件名。因为要用到MD5加密,需要添加引用,在顶部添加“using System.Security.Cryptography;”和“using System.IO;”,否则会报错的。文件拷贝操作需要进一步深入研究的请百度之。

随便找两PDF文件测试一下,没问题后就进行下一步扩展,要知道会议文件未到最后开会都可能未定稿的,可能需要修改标题和重新上传文件。因此需要编辑功能,和主窗体修改会议资料一样,这次我就懒得写操作列表了,直接用鼠标右键菜单搞定它。

拖个contextMenuStrip到这个窗体,绑定在dataGridView里面,对dataGridView属性进行设置,这些前面都讲过就不多讲了。菜单只有3个,删除、修改标题和重新上传文件,启动方式和主窗体的启动方式都是一个鸟样的。

绑定右键菜单

        private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)//右键菜单
{
if (e.Button == MouseButtons.Right)
{
if (e.RowIndex >= 0)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[e.RowIndex].Selected = true;
dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);
}
}
}
删除文件

        private void ToolStripMenuItem_Click(object sender, EventArgs e)//删除文件
{
string sFileID = dataGridView1.CurrentRow.Cells[0].Value.ToString();
MeetingData.MdbData.SQLCom("update MeetingFile set mDelFlag=1 where ID=" + sFileID);
File.Delete(@MeetingData.MdbData.sIISPath() + @"/MeetingFile/" + MeetingData.MdbData.GetAny("MeetingFile", "mFileName", "ID", sFileID));
FileRefresh();
}
删除文件是真的的在硬盘里面把这个文件给删除掉,不会放回收站的,同时修改数据库里面的标志,标志这个文件已经删除。

重新上传文件

        private void NewUpload_Click(object sender, EventArgs e)//重新上传
{
string sFileID = dataGridView1.CurrentRow.Cells[0].Value.ToString();
OpenFileDialog FileDialog = new OpenFileDialog();
FileDialog.InitialDirectory = @Environment.GetFolderPath(Environment.SpecialFolder.Personal);
FileDialog.Filter = @"PDF文件 (*.PDF)|*.pdf";
string sFileName = MeetingData.MdbData.GetAny("MeetingFile", "mFileName", "ID", sFileID);
if (FileDialog.ShowDialog() == DialogResult.OK)
{
File.Copy(@FileDialog.FileName, @MeetingData.MdbData.sIISPath() + @"/MeetingFile/" +sFileName);
MessageBox.Show("文件更新成功,可继续添加会议文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
这里是打开系统的查找文件窗口,拷贝新的PDF文件覆盖掉原有的文件,这里不涉及到修改数据库,只是读出文件名而已。

修改标题

        private void EdtiTitle_Click(object sender, EventArgs e)//修改标题
{
string sFileID = dataGridView1.CurrentRow.Cells[0].Value.ToString();
EditFileTitle eForm = new EditFileTitle(sFileID);
eForm.Owner = this;
eForm.ShowDialog();
}
这里又打开了一个新的窗体,把文件的ID作为参数传递到新窗体中,定义全局变量和赋值都是一样的,不多讲了,新窗体(EditFileTitle)里面就两控件,一个textBox和一个按钮。

服务端管理工具编写(五)——添加议程和上传会议文件

窗口初始化

        private void EditFileTitle_Load(object sender, EventArgs e)
{
textBox1.Text = MeetingData.MdbData.GetAny("MeetingFile", "mTitle", "ID", sID); ;
}
读取已有的文件标题,赋值到textBox1中。

更新数据,就是那个确定按钮的click事件

        private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Trim() == "")
{
MessageBox.Show("文件标题不能为空!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MeetingData.MdbData.SQLCom("update MeetingFile set mTitle='" + textBox1.Text.Trim() + "' where ID=" + sID);
if(MessageBox.Show("文件标题修改成功,请刷新!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)==DialogResult.OK)
this.Close();
}

好了,服务端工具到这里基本就能用了,添加会议、添加文件,进行各种编辑修改都已经基本能完成了,赶进度的项目就将就使用,至于那些人员管理、终端管理放着吧,没有开发经费的项目能用就不错了。

下篇博文开始讲解web端开发了。