由于项目中有很多地方要上传图片、文件什么的,所以就开发了一个用户控件,用来专名处理上船的问题,避免代码的重复性.用了委托技术,调这个方法,只要初始化这个用户空间就ok了,代码如下:
public delegate bool SaveUpload();
private DataTable dtDoc;
private DataTable dtAttachments;
private DataSet dsDoc;
private PyllotUpload frmUploadControl;
private string jobId = "";
private string customer = "";
private string sourceId = "";
private docType docTypes;
public SaveUpload saveUpload;
//判断是否是新增
private bool isNew;
//文件管理进去的,就不需要保存文件表,让外层自己保存
private bool isDocManagement;
//下面方法是用来初始化用户控件的,主要把外层的用户控件实例传进来,我们附件是挂在一个个文件下的.
public void Init(PyllotUpload pUpload, string jobId, string customer, string sourceId, docType sourceDocType)
{
this.frmUploadControl = pUpload;
this.jobId = jobId;
this.customer = customer;
this.sourceId = sourceId;
this.docTypes = sourceDocType;
frmUploadControl.GrdAttachments.DataSource = this.dtAttachments;
frmUploadControl.BtnAttach.Click += new EventHandler(BtnAttach_Click);
frmUploadControl.BtnDownload.Click += new EventHandler(BtnDownload_Click);
frmUploadControl.BtnRemove.Click += new EventHandler(BtnRemove_Click);
saveUpload = new SaveUpload(Save);
this.frmUploadControl.GrdAttachments.DoubleClick += new EventHandler(GrdAttachments_DoubleClick);
//加载数据
this.EditBySourceId(sourceId);
//绑定datasource
BindAllFields();
}
/// <summary>
/// 绑定datasource
/// </summary>
private void BindAllFields()
{
//将数据绑定到编辑控件
UIFacade.BindFields(this.frmUploadControl, this.dsDoc);
UIFacade.BindFields(this.frmUploadControl, this.dtDoc);
UIFacade.BindFields(this.frmUploadControl, this.dtAttachments);
this.frmUploadControl.GrdAttachments.DataSource = dtAttachments;
}
/// <summary>
/// 用于文件管理界面得到附件表
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public void LoadDataSet(DataSet ds, PyllotUpload pUpload)
{
this.dsDoc = ds;
this.dtDoc = this.dsDoc.Tables["DM_MANAGEMENT"];
this.dtAttachments = this.dsDoc.Tables["DM_MANAGEMENT_ATTACHMENTS"];
isDocManagement = true;
//绑定datasource
BindAllFields();
}
/// <summary>
/// 用于 如海出仓储新建数据
/// </summary>
/// <param name="jobId"></param>
/// <param name="sourceId"></param>
/// <param name="sourceType"></param>
/// <returns></returns>
public void NewDataSet()
{
string strDocType = this.docTypes.ToString();
string jobIdLast = "";
if (this.jobId != null)
{
jobIdLast = this.jobId;
}
this.dsDoc = (System.Data.DataSet)UIFacade.Submit("DOCATTACHMENTS_EDITBYDOCID", new object[] { jobIdLast, this.customer.ToString(), sourceId.ToString(), strDocType });
this.dtDoc = this.dsDoc.Tables["DM_MANAGEMENT"];
this.dtAttachments = this.dsDoc.Tables["DM_MANAGEMENT_ATTACHMENTS"];
isDocManagement = false;
//绑定datasource
BindAllFields();
}
/// <summary>
/// 用于 如海出仓储编辑数据
/// </summary>
/// <param name="pUpload"></param>
/// <param name="jobId"></param>
/// <returns></returns>
public DataSet EditByJobId(PyllotUpload pUpload, string jobId)
{
this.dsDoc = (System.Data.DataSet)UIFacade.Submit("DOCATTACHMENTS_EDITBYJOBID", new object[] { jobId });
if (dsDoc == null)
{
return null;
}
this.dtDoc = this.dsDoc.Tables["DM_MANAGEMENT"];
this.dtAttachments = this.dsDoc.Tables["DM_MANAGEMENT_ATTACHMENTS"];
isDocManagement = false;
return dsDoc;
}
/// <summary>
/// 用于 如核销编辑数据
/// </summary>
/// <param name="pUpload"></param>
/// <param name="sourceId"></param>
/// <returns></returns>
public void EditBySourceId(string sourceId)
{
this.dsDoc = (System.Data.DataSet)UIFacade.Submit("DOCATTACHMENTS_EDITBYSOURCEID", new object[] { sourceId });
if (dsDoc == null)
{
return;
}
this.dtDoc = this.dsDoc.Tables["DM_MANAGEMENT"];
this.dtAttachments = this.dsDoc.Tables["DM_MANAGEMENT_ATTACHMENTS"];
isDocManagement = false;
}
/// <summary>
/// 保存方法
/// </summary>
/// <returns></returns>
public bool Save()
{
//开始保存
try
{
DataSet dsChanges = this.dsDoc.GetChanges();
if (dsChanges != null)
{
//加载附件数据
Hashtable htAttachments = new Hashtable();
if (dsChanges.Tables["DM_MANAGEMENT_ATTACHMENTS"] != null)
{
foreach (DataRow dr in dsChanges.Tables["DM_MANAGEMENT_ATTACHMENTS"].Rows)
{
if (dr.RowState == DataRowState.Added)
{
FileStream stream = System.IO.File.Open(dr["SERVER_ATTACHMENTS_PATH"].ToString(), FileMode.Open);
byte[] bytes = this.ConvertStreamToByteBuffer(stream);
htAttachments.Add(dr["DM_MANAGEMENT_ATTACHMENTS_ID"].ToString(), bytes);
stream.Close();
stream = null;
}
}
}
DataSet ds = (DataSet)UIFacade.Submit("DOCATTACHMENTS_SAVE", new object[] { dsChanges, isDocManagement, htAttachments });
this.dsDoc.Merge(ds, false);
this.dsDoc.AcceptChanges();
}
//UIFacade.MsgBox("附件上传成功");
//UIFacade.MsgBox(SystemMessage.SAVE_SUCCESS);
return true;
}
catch (Tools.Service.ExceptionHelper exCustom)
{
UIFacade.MsgBox(exCustom.OriginMessage);
return false;
}
catch (Exception e)
{
//UIFacade.MsgBox("附件上传失败");
//UIFacade.MsgBox(SystemMessage.SAVE_FAILURE);
return false;
}
finally
{
}
}
/// <summary>
/// 把stream转换成buffer
/// </summary>
/// <param name="theStream"></param>
/// <returns></returns>
private byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
{
int b1;
System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
while ((b1 = theStream.ReadByte()) != -1)
{
tempStream.WriteByte(((byte)b1));
}
return tempStream.ToArray();
}
/// <summary>
/// 下载文件
/// </summary>
/// <returns></returns>
private string DownloadFile()
{
object attachmentsId = UIFacade.GetFocusDataColValue(this.frmUploadControl.GrdAttachments, "DM_MANAGEMENT_ATTACHMENTS_ID");
if (attachmentsId == null) return "";
if (UIFacade.GetFoucusDataRow(this.frmUploadControl.GrdAttachments).RowState == DataRowState.Added)
{
return UIFacade.GetFocusDataColValue(this.frmUploadControl.GrdAttachments, "SERVER_ATTACHMENTS_PATH").ToString();
}
else
{
byte[] bytes = (byte[])UIFacade.Submit("DOCATTACHMENTS_DOWNLOADFILE", new object[] { attachmentsId.ToString() });
MemoryStream m = null;
FileStream f = null;
string fileName = "";
try
{
fileName = System.Environment.GetEnvironmentVariable("TEMP") + "//PyllotCargo~" + System.DateTime.Now.Ticks.ToString() + "~" + UIFacade.GetFocusDataColValue(this.frmUploadControl.GrdAttachments, "ATTACHMENTS_NAME").ToString();
//定义并实例化一个内存流,以存放提交上来的字节数组。
m = new MemoryStream(bytes);
//定义实际文件对象,保存上载的文件。
f = new FileStream(fileName, FileMode.Create);
//把内存里的数据写入物理文件
m.WriteTo(f);
}
catch (Exception ex)
{
}
finally
{
if (m != null) m.Close();
if (f != null) f.Close();
f = null;
m = null;
}
return fileName;
}
}
#region "事件"
/// <summary>
/// 删除附件事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void BtnRemove_Click(object sender, EventArgs e)
{
DataRow dr = UIFacade.GetFoucusDataRow(this.frmUploadControl.GrdAttachments);
if (dr == null) return;
if (UIFacade.MsgBoxYesNo(SystemMessage.DELETE_CONFIRM) == DialogResult.Yes)
{
dr.Delete();
}
}
/// <summary>
/// grid双击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void GrdAttachments_DoubleClick(object sender, EventArgs e)
{
DataRow dr = UIFacade.GetFoucusDataRow(this.frmUploadControl.GrdAttachments);
string fileName = DownloadFile();
if (fileName.Equals("")) return;
try
{
System.Diagnostics.Process.Start(fileName);
}
catch (Exception ex)
{
System.Windows.Forms.SaveFileDialog fileDlg = new SaveFileDialog();
if (fileDlg.ShowDialog() == DialogResult.OK)
{
System.IO.File.Copy(fileName, fileDlg.FileName);
}
}
}
/// <summary>
/// 下载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void BtnDownload_Click(object sender, EventArgs e)
{
string fileName = this.DownloadFile();
if (fileName.Equals("")) return;
System.Windows.Forms.SaveFileDialog fileDlg = new SaveFileDialog();
//fileDlg.FileName = fileName;
if (fileDlg.ShowDialog() == DialogResult.OK)
{
System.IO.File.Copy(fileName, fileDlg.FileName);
}
}
/// <summary>
/// 上传事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void BtnAttach_Click(object sender, EventArgs e)
{
if (dtDoc.Rows.Count == 0)
{
this.NewDataSet();
}
System.Windows.Forms.OpenFileDialog fileDlg = new OpenFileDialog();
if (fileDlg.ShowDialog() == DialogResult.OK)
{
DataRow dr = this.dtAttachments.NewRow();
dr["DM_MANAGEMENT_ATTACHMENTS_ID"] = System.DateTime.Now.Ticks;
dr["DM_MANAGEMENT_ID"] = this.dtDoc.Rows[0]["DM_MANAGEMENT_ID"];
//dr["ATTACHMENTS_NAME"] = fileDlg.SafeFileName; 修改得到文件名的方法,防止在不同版本函数库在使用SafeFileName时出问题 modify by aaron 20080622
int len = fileDlg.FileName.Length;
int idx = fileDlg.FileName.LastIndexOf("//") + 1;
dr["ATTACHMENTS_NAME"] = fileDlg.FileName.Substring(idx, len - idx);
dr["SERVER_ATTACHMENTS_PATH"] = fileDlg.FileName;
this.dtAttachments.Rows.Add(dr);
}
}
#endregion
public enum docType
{
海出仓储,
海进仓储,
空出仓储,
空进仓储,
HB_L,
MB_L,
核销单,
税务发票,
Invoice,
STATEMENT,
TAX_REFUND_SHEET,
n新的文件类型,
改单保函
};
}
}