// 结束 public virtual void OnEnd(object sender, StatisEventArgs e) { }
// 初始化 public virtual void OnInitial(object sender, StatisEventArgs e) { }
// 每一记录,在触发MARCFilter之前 public virtual void PreFilter(object sender, StatisEventArgs e) { }
void menu_quickMarcQueryRecords_Click(object sender, EventArgs e) { string strError = ""; int nRet = 0; if (this.listView_browse.SelectedItems.Count == 0) { strError = "尚未选择要执行 MarcQuery 脚本的事项"; goto ERROR1; } // 书目信息缓存 // 如果已经初始化,则保持 if (this.m_biblioTable == null) this.m_biblioTable = new Hashtable(); OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "请指定 MarcQuery 脚本文件"; dlg.FileName = this.m_strUsedMarcQueryFilename; dlg.Filter = "MarcQuery 脚本文件 (*.cs)|*.cs|All files (*.*)|*.*"; dlg.RestoreDirectory = true; if (dlg.ShowDialog() != DialogResult.OK) return; this.m_strUsedMarcQueryFilename = dlg.FileName; MarcQueryHost host = null; Assembly assembly = null; nRet = PrepareMarcQuery(this.m_strUsedMarcQueryFilename, out assembly, out host, out strError); if (nRet == -1) goto ERROR1; host.MainForm = this.MainForm; host.UiForm = this; host.CodeFileName = this.m_strUsedMarcQueryFilename; // 2013/10/8 this.MainForm.OperHistory.AppendHtml("<div class='debug begin'>" + HttpUtility.HtmlEncode(DateTime.Now.ToLongTimeString()) + " 开始执行脚本 " + dlg.FileName + "</div>"); stop.Style = StopStyle.EnableHalfStop; stop.OnStop += new StopEventHandler(this.DoStop); stop.Initial("正在针对书目记录执行 MarcQuery 脚本 ..."); stop.BeginLoop(); this.EnableControls(false); this.listView_browse.Enabled = false; try { // Initial { host.RecordPath = ""; host.MarcRecord = null; host.MarcSyntax = ""; host.Changed = false; host.UiItem = null; StatisEventArgs args = new StatisEventArgs(); host.OnInitial(this, args); if (args.Continue == ContinueType.SkipAll) return; if (args.Continue == ContinueType.Error) { strError = args.ParamString; goto ERROR1; } } if (stop != null) stop.SetProgressRange(0, this.listView_browse.SelectedItems.Count); { host.RecordPath = ""; host.MarcRecord = null; host.MarcSyntax = ""; host.Changed = false; host.UiItem = null; StatisEventArgs args = new StatisEventArgs(); host.OnBegin(this, args); if (args.Continue == ContinueType.SkipAll) return; if (args.Continue == ContinueType.Error) { strError = args.ParamString; goto ERROR1; } } List<ListViewItem> items = new List<ListViewItem>(); foreach (ListViewItem item in this.listView_browse.SelectedItems) { if (string.IsNullOrEmpty(item.Text) == true) continue; items.Add(item); } ListViewBiblioLoader loader = new ListViewBiblioLoader(this.Channels, this.dp2ResTree1.Servers, stop, items, this.m_biblioTable); int i = 0; foreach (LoaderItem item in loader) { Application.DoEvents(); // 出让界面控制权 if (stop != null && stop.State != 0) { strError = "用户中断"; goto ERROR1; } stop.SetProgressValue(i); BiblioInfo info = item.BiblioInfo; string strMARC = ""; string strMarcSyntax = ""; // 将XML格式转换为MARC格式 // 自动从数据记录中获得MARC语法 nRet = MarcUtil.Xml2Marc(info.OldXml, true, null, out strMarcSyntax, out strMARC, out strError); if (nRet == -1) { strError = "XML转换到MARC记录时出错: " + strError; goto ERROR1; } this.MainForm.OperHistory.AppendHtml("<div class='debug recpath'>" + HttpUtility.HtmlEncode(info.RecPath) + "</div>"); string strOuterFieldDef = ""; if (strMarcSyntax == "unimarc") strOuterFieldDef = "4**"; host.RecordPath = info.RecPath; host.MarcRecord = new MarcRecord(strMARC, strOuterFieldDef); host.MarcSyntax = strMarcSyntax; host.Changed = false; host.UiItem = item.ListViewItem; StatisEventArgs args = new StatisEventArgs(); host.OnRecord(this, args); if (args.Continue == ContinueType.SkipAll) break; if (args.Continue == ContinueType.Error) { strError = args.ParamString; goto ERROR1; } if (host.Changed == true) { string strXml = info.OldXml; nRet = MarcUtil.Marc2XmlEx(host.MarcRecord.Text, strMarcSyntax, ref strXml, out strError); if (nRet == -1) goto ERROR1; if (info != null) { if (string.IsNullOrEmpty(info.NewXml) == true) this.m_nChangedCount++; info.NewXml = strXml; info.NewVersion = DateTime.Now.Ticks; } item.ListViewItem.BackColor = SystemColors.Info; item.ListViewItem.ForeColor = SystemColors.InfoText; } // 显示为工作单形式 i++; } { host.RecordPath = ""; host.MarcRecord = null; host.MarcSyntax = ""; host.Changed = false; host.UiItem = null; StatisEventArgs args = new StatisEventArgs(); host.OnEnd(this, args); if (args.Continue == ContinueType.Error) { strError = args.ParamString; goto ERROR1; } } } catch (Exception ex) { strError = "执行 MarcQuery 脚本的过程中出现异常: " + ExceptionUtil.GetDebugText(ex); goto ERROR1; } finally { if (host != null) host.FreeResources(); this.listView_browse.Enabled = true; stop.EndLoop(); stop.OnStop -= new StopEventHandler(this.DoStop); stop.Initial(""); stop.HideProgress(); stop.Style = StopStyle.None; this.EnableControls(true); this.MainForm.OperHistory.AppendHtml("<div class='debug end'>" + HttpUtility.HtmlEncode(DateTime.Now.ToLongTimeString()) + " 结束执行脚本 " + dlg.FileName + "</div>"); } DoViewComment(false); return; ERROR1: MessageBox.Show(this, strError); }