病人管理系统中查看管理图片功能的实现

在我的共享软件-病人资料管理系统(该软件是是一款针对病人基本情况、手术情况、化疗情况、随访情况的存储、修改维护、条件查询、导出导出Excel、科室数据合并、图片查找、数据打印、高级查询等功能的软件)中,客户需要实现对某个属性的图片进行管理维护,图片数量要求有多个,而且同一个资料编辑或者查看中,有很多这样的字段要求进行图片管理,效果如下所示。

 
基本实现方式就是在每个需要保存图片字段用GUID来记录,然后图片记录放到一个独立的表总,通过GUID来识别是属于那种类型的图片。

我们要保证在新建及编辑的时候,都可以正常的添加管理图片,那么我们就需要在加载信息的时候,设置对应按钮的Tag为一个独立的GUID字段,类似下面的代码:

新建的时候,设置类似下面的代码:

            this.btnSHCT.Tag = Guid.NewGuid().ToString();
            
this.btnSHMRI.Tag = Guid.NewGuid().ToString();
            
this.btnSHXRAY.Tag = Guid.NewGuid().ToString();
            
this.btnSQCT.Tag = Guid.NewGuid().ToString();
            
this.btnSQMRI.Tag = Guid.NewGuid().ToString();
            this.btnSQXRAY.Tag = Guid.NewGuid().ToString(); 

编辑的时候,类似i下面的代码: 

                this.btnSHCT.Tag = string.IsNullOrEmpty(info.术后CT) ? Guid.NewGuid().ToString() : info.术后CT;
                
this.btnSHMRI.Tag = string.IsNullOrEmpty(info.术后MRI) ? Guid.NewGuid().ToString() : info.术后MRI;
                
this.btnSHXRAY.Tag = string.IsNullOrEmpty(info.术后XRay) ? Guid.NewGuid().ToString() : info.术后XRay;
                
this.btnSQCT.Tag = string.IsNullOrEmpty(info.术前CT) ? Guid.NewGuid().ToString() : info.术前CT;
                
this.btnSQMRI.Tag = string.IsNullOrEmpty(info.术前MRI) ? Guid.NewGuid().ToString() : info.术前MRI;
                this.btnSQXRAY.Tag = string.IsNullOrEmpty(info.术前XRay) ? Guid.NewGuid().ToString() : info.术前XRay; 


 查看图片的时候,实现就是下面所示的代码:

        private void btnSHXRAY_Click(object sender, EventArgs e)
        {
            Button btn 
= sender as Button;
            
string itemID = btn.Tag.ToString();
            SetPictureButtonData(itemID);
        } 


         private void SetPictureButtonData(string existItemID, string sfDate)
        {
            
#region 验证条件
            
if (this.txtName.Text.Length == 0)
            {
                MessageUtil.ShowTips(
"查看管理图片需要先确定患者姓名");
                
this.txtName.Focus();
                
return;
            }
            
else if (this.txtHospitalNo.Text.Length == 0)
            {
                MessageUtil.ShowTips(
"查看管理图片需要先确定患者住院号");
                
this.txtHospitalNo.Focus();
                
return;
            } 
            
#endregion

            FrmPictureView dlg 
= new FrmPictureView();
            
if (!string.IsNullOrEmpty(existItemID))
            {
                dlg.ItemID 
= existItemID;
            }
            
else
            {
                dlg.ItemID 
= Guid.NewGuid().ToString();
            }

            dlg.SFDate 
= sfDate;
            dlg.PatienName 
= this.txtName.Text;
            dlg.HospitalNo 
= this.txtHospitalNo.Text;
            dlg.ShowDialog();
        }

        
private void SetPictureButtonData(string existItemID)
        {
            SetPictureButtonData(existItemID, 
"");
        }

 而所有图片管理都是用一个窗体来实现,设计视图如下所示:

 

 窗体相关的实现代码如下所示:

        private void sortableListView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            
if (this.sortableListView1.SelectedItems.Count == 0)
                
return;

            ListViewItem item 
= this.sortableListView1.SelectedItems[0];
            
if (item != null && item.Tag !=null)
            {
                PatientPictureInfo info 
= item.Tag as PatientPictureInfo;
                
if (info != null && File.Exists(info.PicturePath))
                {
                    Process.Start(info.PicturePath);
                }
                
else
                {
                    MessageUtil.ShowTips(
"图片文件路径不存在!");
                }
            }
        }

        
private void FrmPictureView_Load(object sender, EventArgs e)
        {
            BindData();
        }

        
private void BindData()
        {
            
if (!string.IsNullOrEmpty(ItemID))
            {
                
this.sortableListView1.Items.Clear();
                List
<PatientPictureInfo> list = BLLFactory<PatientPicture>.Instance.GetAllByItemID(this.ItemID);
                
foreach (PatientPictureInfo info in list)
                {
                    ListViewItem item 
= new ListViewItem(info.FileName);
                    item.SubItems.Add(info.PicturePath);
                    item.Tag 
= info;

                    
this.sortableListView1.Items.Add(item);
                }
            }
        }

        
private void btnClear_Click(object sender, EventArgs e)
        {
            
if (MessageUtil.ShowYesNoAndWarning("您是否确定清除该项目的所有图片记录?\r\n确定后将清除记录但不删除本地图片文件!"== DialogResult.Yes)
            {
                
try
                {
                    
bool success = BLLFactory<PatientPicture>.Instance.DeleteAllByItemID(this.ItemID);
                }
                
catch { }
                
                BindData();
            }
        }

        
private void btnAdd_Click(object sender, EventArgs e)
        {   
            
string pictureRootDir = ConfigurationManager.AppSettings["PictureRootDir"];
            
if (string.IsNullOrEmpty(pictureRootDir))
            {
                MessageUtil.ShowError(
"没有配置项PictureRootDir,请设置一个存放图片文件的主目录!");
                
return;
            }

            
string ImageFilter = "Image Files(*.BMP;*.bmp;*.JPG;*.jpg;*.GIF;*.gif;*.PNG;*.png)|(*.BMP;*.bmp;*.JPG;*.jpg;*.GIF;*.gif;*.PNG;*.png)|All File(*.*)|*.*";
            OpenFileDialog dialog 
= new OpenFileDialog();
            dialog.Filter 
= ImageFilter;
            dialog.Title 
= "请选择图片";
            dialog.RestoreDirectory 
= true;
            dialog.InitialDirectory 
= "D:\\";
            dialog.AddExtension 
= true;
            dialog.Multiselect 
= true;
            
if (dialog.ShowDialog() == DialogResult.OK)
            {
                
string[] filenameArray = dialog.FileNames;
                
foreach (string filePath in filenameArray)
                {
                    
try
                    {
                        
string temp = string.Format("{0}-{1}", PatienName, HospitalNo);
                        
string targetFilePath = Path.Combine(pictureRootDir, temp);
                        
//如果随访日期非空,那么增加一个随访目录(随访(2011-01-01))
                        if (!string.IsNullOrEmpty(SFDate))
                        {
                            targetFilePath 
= Path.Combine(targetFilePath, string.Format("随访({0})", SFDate));
                        }
                        DirectoryUtil.AssertDirExist(targetFilePath);

                        
string fileName = DirectoryUtil.GetFileName(filePath, false);
                        
string targetFilenamePath = Path.Combine(targetFilePath, fileName);
                        DirectoryUtil.Copy(filePath, targetFilenamePath);

                        PatientPictureInfo info 
= new PatientPictureInfo();
                        info.ItemID 
= ItemID;
                        info.FileName 
= fileName;
                        info.PicturePath 
= targetFilenamePath;
                        BLLFactory
<PatientPicture>.Instance.Insert(info);
                    }
                    
catch(Exception ex) 
                    {
                        LogHelper.Error(ex);
                        MessageUtil.ShowTips(ex.Message);
                    }
                }
                BindData();
            }
        } 

以上就是实现的相关逻辑,起主要思路就是为每个字段分配一个独立的GUID,然后新建或者编辑的时候,也要确保GUID的有效性,那样我们把图片存储复制到目录的时候,记录下来的图片地址就可以把它放到数据库记录总,然后查看图片(双击ListVIew选项),就调用图片浏览器显示图片即可。如果为了不让客户安装查看图片工具,也可以自己做一个查看图片的PictureBOx即可。这样就可以实现多个字段多个图片的管理,总体效果还是可以的。


posted on 2011-04-17 19:24  伍华聪  阅读(7208)  评论(7编辑  收藏  举报

导航