AIMS/DocumentManagement/DocumentEntity/EventCodeCompiler.cs
2023-04-19 09:52:53 +08:00

229 lines
8.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using DCSoft.Writer.Controls;
using DCSoft.Writer;
using DCSoft.Writer.Dom;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
using System.Xml;
using HelperDB;
namespace DocumentManagement
{
public class EventCodeCompiler
{
public CompilerResults cr;
public Type type;
private ElementEventTemplate eet;
//string strMouseClickEvent = string.Empty;
//string strContentChangedEvent = string.Empty;
private XTextInputFieldElement SelElement;
private string SelElementName;
private string SelElementValue;
public bool IsLoad = false;
public EventCodeCompiler(ref WriterControl myEditControl, string strMouseClickEvent, string strContentChangedEvent)
{
eet = new ElementEventTemplate();
eet.MouseClick += new ElementMouseEventHandler(eetChk_MouseClick);
eet.MouseDblClick += Eet_MouseDblClick;
eet.ContentChanged += new ContentChangedEventHandler(eet_ContentChanged);
myEditControl.GlobalEventTemplate_Element = eet;
var providerOptions = new Dictionary<string, string>();
providerOptions.Add("CompilerVersion", "v4.0");
CodeDomProvider cdp = new CSharpCodeProvider(providerOptions);
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add("mscorlib.dll");
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.ReferencedAssemblies.Add("DCSoft.Writer.dll");
cp.ReferencedAssemblies.Add("System.Data.Linq.dll");
cp.ReferencedAssemblies.Add("System.Xml.Linq.dll");
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
string source = @"
namespace DocumentManagement
{
using System;
using System.Collections.Generic;
using System.Linq;
using DCSoft.Writer;
using DCSoft.Writer.Dom;
using System.Windows.Forms;
using System.Reflection;
public class BindEvents
{
private static XTextDocument doc;
private static XTextContainerElement container;
public BindEvents(DCSoft.Writer.Controls.WriterControl myEditControl)
{
doc = myEditControl.Document;
container = myEditControl.Document;
}
public static void MouseClickEvent(XTextElement element){
" + strMouseClickEvent + @"
}
public static void ContentChangedEvent(XTextElement element)
{
" + strContentChangedEvent + @"
}
private static void SetValueById(string Id, string type, object value)
{
var element = doc.GetElementsById(Id).FirstElement;
if (element != null)
{
var pChecked = element.GetType().GetProperty(type);
pChecked.SetValue(element, value, null);
element.EditorRefreshView();
}
}
private static void SetValueByName(string name, string type,object value)
{
var element = doc.GetElementsByName(name).FirstElement;
if (element != null)
{
var pChecked = element.GetType().GetProperty(type);
pChecked.SetValue(element, value, null);
element.EditorRefreshView();
}
}
private static bool GetCheckedValueByName(string name)
{
bool? result = null;
var element = doc.GetElementsByName(name).FirstElement;
if (element != null)
{
var pChecked = element.GetType().GetProperty(""Checked"");
result = Convert.ToBoolean(pChecked.GetValue(element, null));
}
return result.Value;
}
}
}
";
cr = cdp.CompileAssemblyFromSource(cp, source);
if (cr.Errors.HasErrors)
{
MessageBox.Show("加载元素事件失败!");
}
else
{
Assembly a = cr.CompiledAssembly;
type = a.GetTypes().Where(x => x.IsClass).FirstOrDefault();
Type[] types = new Type[1];
types[0] = typeof(WriterControl);
ConstructorInfo ci = type.GetConstructor(types);
if (ci != null)
{
object obj = ci.Invoke(new object[] { myEditControl });
}
}
}
public CompilerErrorCollection Errors { get { return cr.Errors; } }
void eet_ContentChanged(object eventSender, ContentChangedEventArgs args)
{
if (args.Element is XTextInputFieldElement)
{
//var element = args.Element as XTextInputFieldElement;
try
{
Object rslt = type.InvokeMember(
"ContentChangedEvent",
BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,
null,
null, // for static class
new object[] { args.Element });
}
catch (Exception exp)
{
MessageBox.Show(exp.StackTrace + ":" + exp.Message);
}
}
}
void eetChk_MouseClick(object eventSender, ElementMouseEventArgs args)
{
if (args.Element is XTextCheckBoxElement || args.Element is XTextRadioBoxElement)
{
try
{
Object rslt = type.InvokeMember(
"MouseClickEvent",
BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,
null,
null, // for static class
new object[] { args.Element });
}
catch (Exception exp)
{
MessageBox.Show(exp.StackTrace + ":" + exp.Message);
}
//var doc = myEditControl.Document;
//var element = args.Element;
}
}
private void Eet_MouseDblClick(object eventSender, ElementMouseEventArgs args)
{
if (eventSender is XTextImageElement && IsLoad == true)
{
frmSelectPersonDoc personDoc = new frmSelectPersonDoc();
personDoc.PersonType = (eventSender as XTextImageElement).Alt == "" ? "麻醉医生" : (eventSender as XTextImageElement).Alt;
personDoc.ShowDialog();
if (personDoc.SelectPersonData > 0)
{
int PersonId = personDoc.SelectPersonData;
string SignatureStr = GetSignatureStr(PersonId);
DCSoft.Drawing.XImageValue img = new DCSoft.Drawing.XImageValue();
img.ImageDataBase64String = SignatureStr;
(eventSender as XTextImageElement).Image = img;
(eventSender as XTextImageElement).Alt = "麻醉医生";
(eventSender as XTextImageElement).Title = PersonId.ToString();
(eventSender as XTextImageElement).EditorRefreshView();
}
else
{
//清空图片
(eventSender as XTextImageElement).Image = null;
(eventSender as XTextImageElement).Alt = "麻醉医生";
(eventSender as XTextImageElement).Title = "";
(eventSender as XTextImageElement).EditorRefreshView();
}
//属性赋值判断
// (eventSender as XTextImageElement).Image.Value==null 判断是否有图片 是否签名
// (eventSender as XTextImageElement).Alt =="签名" 改为已签名或签名ID
// (eventSender as XTextImageElement).Title =="标题" 存储对应ca人员介质
// (eventSender as XTextImageElement).ID =="image3" 标识Id用于定位赋值图片
}
}
public string GetSignatureStr(int SelectPersonData)
{
string SignatureStr = "";
string sql = "select SignatureStr from Person where id=" + SelectPersonData;
SignatureStr = DBHelper.ExecuteScalar(sql).ToString();
return SignatureStr;
}
}
}