void GetTagInfo(ListViewItem item) { ItemInfo item_info = (ItemInfo)item.Tag; OneTag tag = item_info.OneTag; RfidChannel channel = StartRfidChannel( Program.MainForm.RfidCenterUrl, out string strError); if (channel == null) { strError = "StartRfidChannel() error"; goto ERROR1; } try { GetTagInfoResult result = channel.Object.GetTagInfo("*", tag.UID); if (result.Value == -1) { strError = result.ErrorInfo; goto ERROR1; } tag.TagInfo = result.TagInfo; string hex_string = Element.GetHexString(result.TagInfo.Bytes, "4"); item_info.LogicChipItem = LogicChipItem.FromTagInfo(result.TagInfo); item_info.LogicChipItem.PropertyChanged += LogicChipItem_PropertyChanged; this.Invoke((Action)(() => { string pii = item_info.LogicChipItem.PrimaryItemIdentifier; // .FindElement(ElementOID.PII)?.Text; ListViewUtil.ChangeItemText(item, COLUMN_PII, pii); if (this.SelectedPII != null && pii == this.SelectedPII) { item.Font = new Font(item.Font, FontStyle.Bold); } })); return; } catch (Exception ex) { strError = "ListTags() 出现异常: " + ex.Message; goto ERROR1; } finally { EndRfidChannel(channel); } ERROR1: this.Invoke((Action)(() => { ListViewUtil.ChangeItemText(item, COLUMN_PII, "error:" + strError); // 把 item 修改为红色背景,表示出错的状态 SetItemColor(item, "error"); })); }
// 装载芯片数据 bool LoadChipData(string uid, ListViewItem item) { InventoryInfo info = new InventoryInfo { UID = uid, }; GetTagInfoResult result = _driver.GetTagInfo(GetCurrentReaderName(), info); if (result.Value == -1) { this.Invoke((Action)(() => { SetItemColor(item, "error"); ListViewUtil.ChangeItemText(item, 1, $"error:{result.ErrorInfo},error_code:{result.ErrorCode}"); })); return(false); } // 刷新 item 行 ItemInfo tag_info = new ItemInfo { OldInfo = result.TagInfo, LogicChip = LogicChipItem.FromTagInfo(result.TagInfo) }; item.Tag = tag_info; tag_info.LogicChip.DSFID = tag_info.OldInfo.DSFID; tag_info.LogicChip.AFI = tag_info.OldInfo.AFI; tag_info.LogicChip.EAS = tag_info.OldInfo.EAS; tag_info.LogicChip.PropertyChanged += LogicChip_PropertyChanged; string pii = tag_info.LogicChip.FindElement(ElementOID.PII)?.Text; this.Invoke((Action)(() => { ListViewUtil.ChangeItemText(item, 1, pii); ListViewUtil.ChangeItemText(item, 0, uid); SetItemColor(item, "normal"); })); // 如果当前打开的 ChipDialog 正好是这个 UID,则更新它 this.Invoke((Action)(() => { SetChipDialogContent(item, uid); })); return(true); }
// 装入以前的标签信息 // 如果读卡器上有多个标签,则出现对话框让从中选择一个。列表中和右侧 PII 相同的,优先被选定 // parameters: // strStyle 操作方式 // auto_close_dialog 是否要自动关闭选择对话框。条件是选中了 auto_select_pii 事项 // adjust_right 是否自动调整右侧元素。即,把左侧的锁定状态元素覆盖到右侧。调整前要询问。如果不同意调整,可以放弃,然后改为放一个空白标签并装载保存 // saving 是否为了保存而装载?如果是,有些提示要改变 // return: // -1 出错 // 0 放弃装载 // 1 成功装载 int LoadOldChip( string auto_select_pii, string strStyle, out string strError) { strError = ""; bool auto_close_dialog = StringUtil.IsInList("auto_close_dialog", strStyle); bool adjust_right = StringUtil.IsInList("adjust_right", strStyle); bool saving = StringUtil.IsInList("saving", strStyle); try { REDO: // 出现对话框让选择一个 // SelectTagDialog dialog = new SelectTagDialog(); using (RfidToolForm dialog = new RfidToolForm()) { dialog.Text = "选择 RFID 读者卡"; dialog.OkCancelVisible = true; dialog.LayoutVertical = false; dialog.AutoCloseDialog = auto_close_dialog; dialog.SelectedPII = auto_select_pii; dialog.AutoSelectCondition = "auto_or_blankPII"; // 2019/1/30 dialog.ProtocolFilter = InventoryInfo.ISO15693; Program.MainForm.AppInfo.LinkFormState(dialog, "selectTagDialog_formstate"); dialog.ShowDialog(this); if (dialog.DialogResult == DialogResult.Cancel) { strError = "放弃装载 RFID 读者卡内容"; return(0); } { var old_chip = LogicChipItem.FromTagInfo(dialog.SelectedTag.TagInfo); // 首先检查 typeOfUsage 是否为 8X if (old_chip.IsBlank() == false && IsPatronUsage(old_chip) == false) { strError = "当前 RFID 标签是图书类型,不是读者卡类型。请小心不要弄混这两种类型"; string message = $"您所选择的 RFID 标签是图书类型,不是读者卡类型。请小心不要弄混这两种类型。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 读者卡;\r\n[否]将这一种不吻合的 RFID 标签装载进来\r\n[取消]放弃装载"; if (saving) { message = $"您所选择的 RFID 标签是图书类型,不是读者卡类型。请小心不要弄混这两种类型。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 读者卡;\r\n[否]将信息覆盖保存到这一种不吻合的 RFID 标签中(危险)\r\n[取消]放弃保存"; } DialogResult temp_result = MessageBox.Show(this, message, "RfidPatronCardDialog", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (temp_result == DialogResult.Yes) { goto REDO; } if (temp_result == DialogResult.Cancel) { strError = "放弃装载 RFID 读者卡内容"; return(0); } if (saving == false) { MessageBox.Show(this, "警告:您刚装入了一个可疑的读者卡,极有可能不是读者卡而是图书 RFID 标签。待会儿保存读者卡内容的时候,有可能会张冠李戴覆盖了它。保存读者卡内容前,请务必反复仔细检查"); } } } if (auto_close_dialog == false // && string.IsNullOrEmpty(auto_select_pii) == false && dialog.SelectedPII != auto_select_pii && string.IsNullOrEmpty(dialog.SelectedPII) == false ) { string message = $"您所选择的读者卡其 PII 为 '{dialog.SelectedPII}',和期待的 '{auto_select_pii}' 不吻合。请小心检查是否正确。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 读者卡;\r\n[否]将这一种不吻合的 RFID 读者卡装载进来\r\n[取消]放弃装载"; if (saving) { message = $"您所选择的读者卡其 PII 为 '{dialog.SelectedPII}',和期待的 '{auto_select_pii}' 不吻合。请小心检查是否正确。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 读者卡;\r\n[否]将信息覆盖保存到这一种不吻合的 RFID 读者卡中(危险)\r\n[取消]放弃保存"; } DialogResult temp_result = MessageBox.Show(this, message, "RfidPatronCardDialog", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (temp_result == DialogResult.Yes) { goto REDO; } if (temp_result == DialogResult.Cancel) { strError = "放弃装载 RFID 读者卡内容"; return(0); } if (saving == false) { MessageBox.Show(this, "警告:您刚装入了一个可疑的读者卡,极有可能不是当前读者记录对应的读者卡。待会儿保存读者卡内容的时候,有可能会张冠李戴覆盖了它。保存读者卡内容前,请务必反复仔细检查"); } } var tag_info = dialog.SelectedTag.TagInfo; _tagExisting = dialog.SelectedTag; var chip = LogicChipItem.FromTagInfo(tag_info); this.chipEditor_existing.LogicChipItem = chip; if (adjust_right) { int nRet = Merge(this.chipEditor_existing.LogicChipItem, this.chipEditor_editing.LogicChipItem, out strError); if (nRet == -1) { return(-1); } // 让右侧编辑器感受到 readonly 和 text 的变化 var save = this.chipEditor_editing.LogicChipItem; this.chipEditor_editing.LogicChipItem = null; this.chipEditor_editing.LogicChipItem = save; } return(1); } } catch (Exception ex) { strError = "出现异常: " + ex.Message; return(-1); } }
private void toolStripButton_saveRfid_Click(object sender, EventArgs e) { // 写入以前,装载标签内容到左侧,然后调整右侧(中间可能会警告)。然后再保存 string strError = ""; string pii = this._barcode; // 从修改前的 // 看左侧是否装载过。如果没有装载过则自动装载 if (_leftLoaded == false) { // return: // -1 出错 // 0 放弃装载 // 1 成功装载 int nRet = LoadOldChip(pii, "adjust_right,saving", out strError); if (nRet == -1) { goto ERROR1; } if (nRet == 0) { strError = "已放弃保存 RFID 读者卡内容"; goto ERROR1; } } // 然后保存 { int nRet = SaveNewChip(out strError); if (nRet == -1) { goto ERROR1; } } MessageBox.Show(this, "保存成功"); // 刷新左侧显示 { // 用保存后的确定了的 UID 重新装载 int nRet = LoadChipByUID( _tagExisting.ReaderName, _tagExisting.TagInfo.UID, out TagInfo tag_info, out strError); if (nRet == -1) { _leftLoaded = false; strError = "保存 RFID 读者卡内容已经成功。但刷新左侧显示时候出错: " + strError; goto ERROR1; } _tagExisting.TagInfo = tag_info; var chip = LogicChipItem.FromTagInfo(tag_info); this.chipEditor_existing.LogicChipItem = chip; } return; ERROR1: MessageBox.Show(this, strError); }
// 写入右侧的信息到标签 private void toolStripButton_saveRfid_Click(object sender, EventArgs e) { { BookItem item = this.Item.Clone(); item.RecordDom = this._editing.DataDom; EnsureCreateAccessNo(item); } // 写入以前,装载标签内容到左侧,然后调整右侧(中间可能会警告)。然后再保存 string strError = ""; // string pii = this.chipEditor_editing.LogicChipItem.FindElement(ElementOID.PII).Text; string pii = GetPII(this.Item.OldRecord); // 从修改前的册记录中获得册条码号 // 看左侧是否装载过。如果没有装载过则自动装载 if (_leftLoaded == false) { // return: // -1 出错 // 0 放弃装载 // 1 成功装载 int nRet = LoadOldChip(pii, "adjust_right,saving", // false, true, out strError); if (nRet == -1) { goto ERROR1; } if (nRet == 0) { strError = "已放弃保存 RFID 标签内容"; goto ERROR1; } } // 然后保存 { int nRet = SaveNewChip(out strError); if (nRet == -1) { goto ERROR1; } } // TODO: 改成类似 ShowMessage() 效果 MessageBox.Show(this, "保存成功"); // 刷新左侧显示 { Debug.Assert(_tagExisting != null, ""); Debug.WriteLine("222 " + (_tagExisting.TagInfo != null ? "!=null" : "==null")); Debug.Assert(_tagExisting.TagInfo != null, ""); // 2019/9/30 Debug.Assert(_tagExisting.AntennaID == _tagExisting.TagInfo.AntennaID, $"1 _tagExisting.AntennaID({_tagExisting.AntennaID}) 应该 == _tagExisting.TagInfo.AntennaID({_tagExisting.TagInfo.AntennaID})"); // 用保存后的确定了的 UID 重新装载 int nRet = LoadChipByUID( _tagExisting.ReaderName, _tagExisting.TagInfo.UID, _tagExisting.AntennaID, out TagInfo tag_info, out strError); if (nRet == -1) { _leftLoaded = false; strError = "保存 RFID 标签内容已经成功。但刷新左侧显示时候出错: " + strError; goto ERROR1; } Debug.Assert(tag_info != null, ""); _tagExisting.TagInfo = tag_info; _tagExisting.AntennaID = tag_info.AntennaID; // 2019/9/30 Debug.WriteLine("set taginfo"); var chip = LogicChipItem.FromTagInfo(tag_info); this.chipEditor_existing.LogicChipItem = chip; #if NO string new_pii = this.chipEditor_editing.LogicChipItem.FindElement(ElementOID.PII)?.Text; // return: // -1 出错 // 0 放弃装载 // 1 成功装载 int nRet = LoadOldChip(new_pii, "auto_close_dialog", // true, false, out strError); if (nRet != 1) { // this.chipEditor_existing.LogicChipItem = null; _leftLoaded = false; strError = "保存 RFID 标签内容已经成功。但刷新左侧显示时候出错: " + strError; goto ERROR1; } #endif } return; ERROR1: MessageBox.Show(this, strError); }
// 装入以前的标签信息 // 如果读卡器上有多个标签,则出现对话框让从中选择一个。列表中和右侧 PII 相同的,优先被选定 // parameters: // strStyle 操作方式 // auto_close_dialog 是否要自动关闭选择对话框。条件是选中了 auto_select_pii 事项 // adjust_right 是否自动调整右侧元素。即,把左侧的锁定状态元素覆盖到右侧。调整前要询问。如果不同意调整,可以放弃,然后改为放一个空白标签并装载保存 // saving 是否为了保存而装载?如果是,有些提示要改变 // return: // -1 出错 // 0 放弃装载 // 1 成功装载 int LoadOldChip( string auto_select_pii, string strStyle, #if NO bool auto_close_dialog, bool adjust_right, #endif out string strError) { strError = ""; bool auto_close_dialog = StringUtil.IsInList("auto_close_dialog", strStyle); bool adjust_right = StringUtil.IsInList("adjust_right", strStyle); bool saving = StringUtil.IsInList("saving", strStyle); try { REDO: // 出现对话框让选择一个 // SelectTagDialog dialog = new SelectTagDialog(); RfidToolForm dialog = new RfidToolForm(); dialog.Text = "选择 RFID 标签"; dialog.OkCancelVisible = true; dialog.LayoutVertical = false; dialog.AutoCloseDialog = auto_close_dialog; dialog.SelectedPII = auto_select_pii; dialog.AutoSelectCondition = "auto_or_blankPII"; // 2019/1/30 Program.MainForm.AppInfo.LinkFormState(dialog, "selectTagDialog_formstate"); dialog.ShowDialog(this); if (dialog.DialogResult == DialogResult.Cancel) { strError = "放弃装载 RFID 标签内容"; return(0); } if (auto_close_dialog == false // && string.IsNullOrEmpty(auto_select_pii) == false && dialog.SelectedPII != auto_select_pii && string.IsNullOrEmpty(dialog.SelectedPII) == false ) { string message = $"您所选择的标签其 PII 为 '{dialog.SelectedPII}',和期待的 '{auto_select_pii}' 不吻合。请小心检查是否正确。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 标签;\r\n[否]将这一种不吻合的 RFID 标签装载进来\r\n[取消]放弃装载"; if (saving) { message = $"您所选择的标签其 PII 为 '{dialog.SelectedPII}',和期待的 '{auto_select_pii}' 不吻合。请小心检查是否正确。\r\n\r\n是否重新选择?\r\n\r\n[是]重新选择 RFID 标签;\r\n[否]将信息覆盖保存到这一种不吻合的 RFID 标签中(危险)\r\n[取消]放弃保存"; } DialogResult temp_result = MessageBox.Show(this, message, "EntityEditForm", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (temp_result == DialogResult.Yes) { goto REDO; } if (temp_result == DialogResult.Cancel) { strError = "放弃装载 RFID 标签内容"; return(0); } if (saving == false) { MessageBox.Show(this, "警告:您刚装入了一个可疑的标签,极有可能不是当前册对应的标签。待会儿保存标签内容的时候,有可能会张冠李戴覆盖了它。保存标签内容前,请务必反复仔细检查"); } } var tag_info = dialog.SelectedTag.TagInfo; _tagExisting = dialog.SelectedTag; var chip = LogicChipItem.FromTagInfo(tag_info); this.chipEditor_existing.LogicChipItem = chip; if (adjust_right) { int nRet = Merge(this.chipEditor_existing.LogicChipItem, this.chipEditor_editing.LogicChipItem, out strError); if (nRet == -1) { return(-1); } // 让右侧编辑器感受到 readonly 和 text 的变化 var save = this.chipEditor_editing.LogicChipItem; this.chipEditor_editing.LogicChipItem = null; this.chipEditor_editing.LogicChipItem = save; } return(1); } catch (Exception ex) { strError = "出现异常: " + ex.Message; return(-1); } }