在我的共享软件-病人资料管理系统(该软件是是一款针对病人基本情况、手术情况、化疗情况、随访情况的存储、修改维护、条件查询、导出导出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即可。这样就可以实现多个字段多个图片的管理,总体效果还是可以的。


标签: none

添加新评论