/// <summary> /// 设置指定字段名的第一个字段内的指定子字段名的第一个子字段的值。 /// 如果不存在这样的字段和子字段,则次第创建 /// </summary> /// <param name="strFieldName">字段名</param> /// <param name="strSubfieldName">子字段名</param> /// <param name="strSubfieldValue">子字段值</param> public void SetFirstSubfield(string strFieldName, string strSubfieldName, string strSubfieldValue) { Field field = this.GetOneField(strFieldName, 0); if (field == null) { field = this.Add(strFieldName, " ", "", true); } if (field == null) { throw new Exception("不可能的情况"); } Subfield subfield = field.Subfields.GetSubfield(strSubfieldName, 0); if (subfield != null) { subfield.Value = strSubfieldValue; } else { subfield = new Subfield(); subfield.m_strName = strSubfieldName; subfield.m_strValue = strSubfieldValue; field.Subfields.Add(subfield, true); } }
// 注:返回collection对象是为了方便set回Field.Subfields /// <summary> /// 从当前集合中移出一个 Subfield 对象 /// </summary> /// <param name="subfield">要移出的 Subfield 对象</param> /// <returns>顺便返回当前集合对象</returns> public SubfieldCollection Remove(Subfield subfield) { base.Remove(subfield); Flush(); return(this); }
// 需要做一个根据字符偏移量定位到子字段的函数 /// <summary> /// 将 Subfield 对象对象添加到 当前集合 的结尾处;或者按照子字段名字母顺序插入。 /// </summary> /// <param name="subfield">要插入的 Subfield 对象</param> /// <param name="bInOrder">是否按照子字段名字母顺序插入。如果为 false,则表示追加到集合末尾</param> public void Add(Subfield subfield, bool bInOrder) { if (bInOrder == true) { int nPosition = GetPosition(subfield.Name); base.Insert(nPosition, subfield); } else { base.Add(subfield); } this.Flush(); }
/// <summary> /// 根据一个 Field 对象的内容创建一个新的 SubfieldCollection 对象 /// </summary> /// <param name="container">Field 对象,也被当作要创建的 SubfieldCollection 对象的容器</param> /// <returns>新创建的 SubfieldCollection 对象</returns> public static SubfieldCollection BuildSubfields(Field container) { SubfieldCollection subfields = new SubfieldCollection(); string strField = container.Text; for (int i = 0; ; i++) { string strSubfield = ""; string strNextSubfieldName = ""; // 从字段或子字段组中得到一个子字段 // parameters: // strText 字段内容,或者子字段组内容。 // textType 表示strText中包含的是字段内容还是组内容。若为ItemType.Field,表示strText参数中为字段;若为ItemType.Group,表示strText参数中为子字段组。 // strSubfieldName 子字段名,内容为1位字符。如果==null,表示任意子字段 // 形式为'a'这样的。 // nIndex 想要获得同名子字段中的第几个。从0开始计算。 // strSubfield [out]输出子字段。子字段名(1字符)、子字段内容。 // strNextSubfieldName [out]下一个子字段的名字,内容一个字符 // return: // -1 出错 // 0 所指定的子字段没有找到 // 1 找到。找到的子字段返回在strSubfield参数中 int nRet = MarcUtil.GetSubfield( strField, ItemType.Field, null, i, out strSubfield, out strNextSubfieldName); if (nRet == -1 || nRet == 0) { break; } Subfield subfield = new Subfield(); subfield.Text = strSubfield; subfield.Container = subfields; subfields.Add(subfield); } subfields.Container = container; return(subfields); }
/// <summary> /// 将集合元素的情况兑现到容器对象的 Value 成员中 /// </summary> public void Flush() { if (this.Container == null) { return; } string strValue = ""; for (int i = 0; i < this.Count; i++) { Subfield subfield = (Subfield)this[i]; strValue += new string(Record.SUBFLD, 1) + subfield.Name + subfield.Value; } this.Container.Value = strValue; }
// 取指定名称第一个字段的第一个子字段 /// <summary> /// 取指定字段名的第一个字段的第一个子字段 /// </summary> /// <param name="strFieldName">字段名</param> /// <param name="strSubfieldName">子字段名</param> /// <returns>子字段值</returns> public string GetFirstSubfield(string strFieldName, string strSubfieldName) { Field field = this.GetOneField(strFieldName, 0); if (field == null) { return(""); } Subfield subfield = field.Subfields.GetSubfield(strSubfieldName, 0); if (subfield == null) { return(""); } return(subfield.Value); }
// 根据子字段名找到偏移量 /// <summary> /// 根据子字段名找到它在集合中的偏移量 /// </summary> /// <param name="strSubfieldName">子字段名</param> /// <returns>从 0 开始计算的偏移量。如果不存在,则返回 this.Count 值</returns> public int GetPosition(string strSubfieldName) { int nPosition = 0; // Debug.Assert(false, ""); for (int i = 0; i < this.Count; i++) { nPosition = i; Subfield subfield = this[i]; if (String.Compare(subfield.Name, strSubfieldName) > 0) { return(nPosition); } } return(this.Count); // 2007/7/10 changed // return nPosition; }
// parameters: // strName 子字段名 // nDupIndex 第几个 /// <summary> /// 根据子字段名和重复位置获取一个 Subfield 对象 /// </summary> /// <param name="strName">子字段名。一个字符的字符串</param> /// <param name="nDupIndex">在同名的子字段中的索引,从 0 开始计算</param> /// <returns>Subfield 元素。</returns> public Subfield GetSubfield(string strName, int nDupIndex) { int nDup = 0; for (int i = 0; i < this.Count; i++) { Subfield subfield = this[i]; if (subfield.Name == strName) { if (nDupIndex == nDup) { return(subfield); } nDup++; } } return(null); }
/// <summary> /// 获取或设置指定 Name 的 Subfield 元素。还能指定在同名子字段中是哪一个。 /// 设置的时候,如果尚不存在这个名字的指定重复位置的子字段对象,则追加一个子字段对象 /// </summary> /// <param name="strName">子字段名。一个字符的字符串</param> /// <param name="nDupIndex">在同名的子字段中的索引,从 0 开始计算</param> /// <returns>指定 Name 的 Subfield 元素。</returns> public Subfield this[string strName, int nDupIndex] { get { return(GetSubfield(strName, nDupIndex)); } set { Subfield subfield = GetSubfield(strName, nDupIndex); if (subfield == null) { //throw(new Exception("未找到")); this.Add(value); return; } int i = this.IndexOf(subfield); base[i] = value; Flush(); } }
/// <summary> /// 将 Subfield 元素插入 当前集合的 的指定索引处。 /// </summary> /// <param name="index">索引</param> /// <param name="subfield">Subfield 对象</param> public void Insert(int index, Subfield subfield) { base.Insert(index, subfield); Flush(); }
void Copy225To410() { Field field_225 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("225", 0); if (field_225 == null) { MessageBox.Show(this.DetailForm, "225字段不存在"); return; } SubfieldCollection subfields_225 = field_225.Subfields; Subfield subfield_a = subfields_225["a"]; if (subfield_a == null) { MessageBox.Show(this.DetailForm, "225$" + "a" + "不存在"); return; } string strContent = subfield_a.Value; // 看看当前活动字段是不是410 Field field_410 = null; field_410 = this.DetailForm.MarcEditor.FocusedField; if (field_410 != null) { if (field_410.Name != "410") field_410 = null; } bool bInitial410Value = false; // 410字段的值是否初始化过 if (field_410 == null) { field_410 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("410", 0); if (field_410 == null) { field_410 = this.DetailForm.MarcEditor.Record.Fields.Add("410", " ", new string((char)31, 1) + "1200 " + new string((char)31, 1) + "a", true); bInitial410Value = true; } } if (bInitial410Value == false) { field_410.Value = new string((char)31, 1) + "1200 " + new string((char)31, 1) + "a" + field_410.Value; } if (field_410 == null) throw (new Exception("error ...")); Subfield subfield_410a = field_410.Subfields["a"]; if (subfield_410a == null) { subfield_410a = new Subfield(); subfield_410a.Name = "a"; } subfield_410a.Value = strContent; field_410.Subfields["a"] = subfield_410a; }
// 注:返回collection对象是为了方便set回Field.Subfields /// <summary> /// 从当前集合中移出一个 Subfield 对象 /// </summary> /// <param name="subfield">要移出的 Subfield 对象</param> /// <returns>顺便返回当前集合对象</returns> public SubfieldCollection Remove(Subfield subfield) { base.Remove(subfield); Flush(); return this; }
/// <summary> /// 根据一个 Field 对象的内容创建一个新的 SubfieldCollection 对象 /// </summary> /// <param name="container">Field 对象,也被当作要创建的 SubfieldCollection 对象的容器</param> /// <returns>新创建的 SubfieldCollection 对象</returns> public static SubfieldCollection BuildSubfields(Field container) { SubfieldCollection subfields = new SubfieldCollection(); string strField = container.Text; for (int i = 0; ; i++) { string strSubfield = ""; string strNextSubfieldName = ""; // 从字段或子字段组中得到一个子字段 // parameters: // strText 字段内容,或者子字段组内容。 // textType 表示strText中包含的是字段内容还是组内容。若为ItemType.Field,表示strText参数中为字段;若为ItemType.Group,表示strText参数中为子字段组。 // strSubfieldName 子字段名,内容为1位字符。如果==null,表示任意子字段 // 形式为'a'这样的。 // nIndex 想要获得同名子字段中的第几个。从0开始计算。 // strSubfield [out]输出子字段。子字段名(1字符)、子字段内容。 // strNextSubfieldName [out]下一个子字段的名字,内容一个字符 // return: // -1 出错 // 0 所指定的子字段没有找到 // 1 找到。找到的子字段返回在strSubfield参数中 int nRet = MarcUtil.GetSubfield(strField, ItemType.Field, null, i, out strSubfield, out strNextSubfieldName); if (nRet == -1 || nRet == 0) break; Subfield subfield = new Subfield(); subfield.Text = strSubfield; subfield.Container = subfields; subfields.Add(subfield); } subfields.Container = container; return subfields; }
/// <summary> /// 将 Subfield 对象对象添加到 当前集合 的结尾处。 /// </summary> /// <param name="subfield">要添加的 Subfield 对象</param> public void Add(Subfield subfield) { base.Add(subfield); Flush(); }
static void NewSubfield( Field field, string strName, string strContent) { Subfield subfield = new Subfield(); subfield.Name = strName; subfield.Value = strContent; field.Subfields[strName] = subfield; }
void Copy245cTo7xxa(string strFromSubfield, string strToFields) { Field field_245 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("245", 0); if (field_245 == null) { MessageBox.Show(this.DetailForm, "245字段不存在"); return; } SubfieldCollection subfields_245 = field_245.Subfields; Subfield subfield_f = subfields_245[strFromSubfield]; if (subfield_f == null) { MessageBox.Show(this.DetailForm, "245$" + strFromSubfield + "不存在"); return; } string strContent = subfield_f.Value; // 看看当前活动字段是不是700 Field field_700 = null; field_700 = this.DetailForm.MarcEditor.FocusedField; string strToField = FirstOf(strToFields); if (field_700 != null) { if (StringUtil.IsInList(field_700.Name, strToFields) == true) strToField = field_700.Name; else field_700 = null; } if (field_700 == null) { field_700 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_700 == null) { field_700 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_700 == null) throw (new Exception("error ...")); Subfield subfield_700a = field_700.Subfields["a"]; if (subfield_700a == null) { subfield_700a = new Subfield(); subfield_700a.Name = "a"; } subfield_700a.Value = strContent; field_700.Subfields["a"] = subfield_700a; }
void Copy690aTo905d(string strFromSubfield, string strToField) { Field field_690 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("690", 0); if (field_690 == null) { MessageBox.Show(this.DetailForm, "690字段不存在"); return; } SubfieldCollection subfields_690 = field_690.Subfields; Subfield subfield_a = subfields_690[strFromSubfield]; if (subfield_a == null) { MessageBox.Show(this.DetailForm, "690$" + strFromSubfield + "不存在"); return; } string strContent = subfield_a.Value; // 看看当前活动字段是不是905 Field field_905 = null; field_905 = this.DetailForm.MarcEditor.FocusedField; if (field_905 != null) { if (field_905.Name != strToField) field_905 = null; } if (field_905 == null) { field_905 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_905 == null) { field_905 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_905 == null) throw (new Exception("error ...")); Subfield subfield_905d = field_905.Subfields["d"]; if (subfield_905d == null) { subfield_905d = new Subfield(); subfield_905d.Name = "d"; } subfield_905d.Value = strContent; field_905.Subfields["d"] = subfield_905d; }
void Copy200gfTo7xxa(string strFromSubfield, string strToField) { Field field_200 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("200", 0); if (field_200 == null) { MessageBox.Show(this.DetailForm, "200字段不存在"); return; } SubfieldCollection subfields_200 = field_200.Subfields; Subfield subfield_f = subfields_200[strFromSubfield]; if (subfield_f == null) { MessageBox.Show(this.DetailForm, "200$" + strFromSubfield + "不存在"); return; } string strContent = subfield_f.Value; // 看看当前活动字段是不是701 Field field_701 = null; field_701 = this.DetailForm.MarcEditor.FocusedField; if (field_701 != null) { if (field_701.Name != strToField) field_701 = null; } if (field_701 == null) { field_701 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_701 == null) { field_701 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_701 == null) throw (new Exception("error ...")); Subfield subfield_701a = field_701.Subfields["a"]; if (subfield_701a == null) { subfield_701a = new Subfield(); subfield_701a.Name = "a"; } subfield_701a.Value = strContent; field_701.Subfields["a"] = subfield_701a; }
void Copy100aTo245c(string strFromSubfield, string strToField) { Field field_100 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("100", 0); if (field_100 == null) { MessageBox.Show(this.DetailForm, "100字段不存在"); return; } SubfieldCollection subfields_100 = field_100.Subfields; Subfield subfield_f = subfields_100[strFromSubfield]; if (subfield_f == null) { MessageBox.Show(this.DetailForm, "100$" + strFromSubfield + "不存在"); return; } string strContent = subfield_f.Value; // 看看当前活动字段是不是245 Field field_245 = null; field_245 = this.DetailForm.MarcEditor.FocusedField; if (field_245 != null) { if (field_245.Name != strToField) field_245 = null; } if (field_245 == null) { field_245 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_245 == null) { field_245 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_245 == null) throw (new Exception("error ...")); Subfield subfield_245a = field_245.Subfields["c"]; if (subfield_245a == null) { subfield_245a = new Subfield(); subfield_245a.Name = "c"; } subfield_245a.Value = strContent; field_245.Subfields["c"] = subfield_245a; }