mschill f0493e60d8 CSM B2024-087 Fix RO Editor Inconsistencies
Refresh issue in RO Definitions.  Modify an In Use field item that is not one of the Standard items, choose Continue, choose OK in the Text Definition Field. when prompted if want to Update Local or Generic definitions:

1. Prompt should contain table name (previously was not for Setpoint items)

2. If Select "Yes", Should refresh to new field name when return to previous screen / click ok to go back to RO Definition.
2024-10-25 14:33:20 -04:00

709 lines
23 KiB
C#

/*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------
* $Workfile: GroupDefFrm.cs $ $Revision: 17 $
* $Author: Jsj $ $Date: 7/02/03 9:25a $
*
* $History: GroupDefFrm.cs $
*
* ***************** Version 17 *****************
* User: Jsj Date: 7/02/03 Time: 9:25a
* Updated in $/EXE/RefObj/ROEditor
* made messagebox calls modal by removing the parent window reference
*
* ***************** Version 16 *****************
* User: Kathy Date: 5/21/03 Time: 12:50p
* Updated in $/EXE/RefObj/ROEditor
* B2003-034: process if only one field. Also, check for all data on okay
* button select.
*
* ***************** Version 15 *****************
* User: Kathy Date: 5/07/03 Time: 1:58p
* Updated in $/EXE/RefObj/ROEditor
* B2003-033 fixed
*
* ***************** Version 14 *****************
* User: Jsj Date: 4/14/03 Time: 3:01p
* Updated in $/EXE/RefObj/ROEditor
* changes resulting from speeding up RO FST file creation
*
* ***************** Version 13 *****************
* User: Kathy Date: 3/11/03 Time: 11:25a
* Updated in $/EXE/RefObj/ROEditor
* allow extra text on accpageid template
*
* ***************** Version 12 *****************
* User: Kathy Date: 12/10/02 Time: 2:26p
* Updated in $/EXE/RefObj/ROEditor
* fieldname special char
*
* ***************** Version 11 *****************
* User: Kathy Date: 12/02/02 Time: 8:29a
* Updated in $/EXE/RefObj/ROEditor
* fieldname replace chars
*
* ***************** Version 10 *****************
* User: Kathy Date: 12/02/02 Time: 6:18a
* Updated in $/EXE/RefObj/ROEditor
* added status on long ops & check for fieldname change for textbox
*
* ***************** Version 9 *****************
* User: Kathy Date: 10/15/02 Time: 2:18p
* Updated in $/EXE/RefObj/ROEditor
* mods for new group (toplevel)
*
* ***************** Version 8 *****************
* User: Kathy Date: 10/10/02 Time: 10:02a
* Updated in $/EXE/RefObj/ROEditor
* accessory page id
*
* ***************** Version 7 *****************
* User: Kathy Date: 10/02/02 Time: 1:40p
* Updated in $/EXE/RefObj/ROEditor
* clean up
*
* ***************** Version 6 *****************
* User: Kathy Date: 9/27/02 Time: 1:14p
* Updated in $/EXE/RefObj/ROEditor
* fix digit as first char in fieldname
*
* ***************** Version 5 *****************
* User: Kathy Date: 9/25/02 Time: 9:57a
* Updated in $/EXE/RefObj/ROEditor
* dev
*
* ***************** Version 4 *****************
* User: Kathy Date: 9/19/02 Time: 10:03a
* Updated in $/EXE/RefObj/ROEditor
* only allow mods at root
*
* ***************** Version 3 *****************
* User: Kathy Date: 9/11/02 Time: 1:15p
* Updated in $/EXE/RefObj/ROEditor
* vlnxml
*
* ***************** Version 2 *****************
* User: Kathy Date: 8/28/02 Time: 10:56a
* Updated in $/EXE/RefObj/ROEditor
* development
*********************************************************************************************/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Xml;
using System.Text;
using RODBInterface;
using ROFields;
using VlnStatus;
using System.Linq;
namespace ROEditor
{
/// <summary>
/// Summary description for GroupDefinition.
/// </summary>
public class GroupDefFrm : System.Windows.Forms.Form
{
private System.Windows.Forms.Label lblGroup;
private System.Windows.Forms.TextBox tbGroup;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label lblPrefix;
private System.Windows.Forms.Label lblValue;
private System.Windows.Forms.TextBox tbPrefix;
private System.Windows.Forms.TextBox tbValue;
private System.Windows.Forms.Button btnRODef;
private System.Windows.Forms.Button btnSubDef;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private RODB myrodb;
private VlnXmlElement elem;
private string origGroup;
private string origPrefix;
private string origValue;
private int dbtype;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public GroupDefFrm(VlnXmlElement pelem, RODB rodb, string gpname,int idbtype)
{
myrodb = rodb;
elem = pelem;
origGroup = gpname;
dbtype=idbtype; // if new, 3 = user define, must define fields before save.
//
// Required for Windows Form Designer support
//
InitializeComponent();
FillInData();
}
private string CvtUserFldToFld(string fldname)
{
if (fldname.Length < 2)
return fldname;
// a digit cannot start an xml fieldname, prepend a "__" to it.
string tmp0;
if (char.IsDigit(fldname,0))
tmp0 = "__" + fldname;
else
tmp0 = fldname;
// an xml fieldname cannot have a space, change it to a "__"
string tmpstr = tmp0.Replace(" ","__");
int len = tmpstr.Length;
int cnt = 0;
// this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
// of the character we replaced.
string OKpunch = "-._";
string outstr = "";
int decval;
while (cnt < len)
{
char tmpchr = tmpstr[cnt];
if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
{
decval = tmpchr;
outstr += OKpunch + decval.ToString("D3");
}
else
{
outstr += tmpchr.ToString();
}
cnt++;
}
return outstr;
}
private string CvtFldToUserFld(string fldname)
{
string tmpstr0;
if (fldname.Length < 2) return fldname;
// an xml element name cannot begin with a digit. we had prepended a "__"
if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
tmpstr0 = fldname.Substring(2,fldname.Length-2);
else
tmpstr0 = fldname;
// an xml element name cannot have a space, we converted to a "__"
string tmpstr = tmpstr0.Replace("__"," ");
int len = tmpstr.Length;
int cur = 0;
// this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
// of the character we replaced.
string OKpunch = "-._";
string outstr = "";
int decval, indx;
if (len <6)
indx = -1;
else
indx=tmpstr.IndexOf(OKpunch,cur);
string asc_spchar;
while (indx>=0)
{
outstr += tmpstr.Substring(cur,indx-cur);
asc_spchar = tmpstr.Substring(indx+3,3);
decval = System.Convert.ToInt16(asc_spchar,10);
outstr += System.Convert.ToChar(decval).ToString();
cur = indx+6;
if (cur+6 > len)
indx = -1;
else
indx = tmpstr.IndexOf(OKpunch,cur);
}
if (cur<len) outstr += tmpstr.Substring(cur,len-cur);
return outstr;
}
private string DetermineGroupName()
{
// if group immediately below root, just use text at this node & it can be editted
// otherwise, parse it according to GroupMenuItem and it's not editable (it
// gets editted by editting the data of the group).
if (elem.ParentNode.Name == "RO_Root")
{
this.tbGroup.Enabled = true;
this.tbPrefix.Enabled = true;
this.tbValue.Enabled = true;
return CvtFldToUserFld(origGroup);
}
else
{
this.tbGroup.Enabled = false;
this.tbPrefix.Enabled = false;
this.tbValue.Enabled = false;
return CvtFldToUserFld(origGroup);
}
}
//CSM C2024-023
//Part of 2024 PROMS Upgrades
//When the Overall Form is activated
//if there are any items that are Fields that are in use
//add them as auto-complete options to the
//Accessory Page Access - Value Textbox
//Typing < will bring up the auto-complete options
protected void tbValue_AddAutoComplete(object sender, EventArgs e)
{
string dummy = ""; // need for RODB_GetFIeldsInUse call, won't be used.
ArrayList AvailList, InUseList;
//first see if it is a valid 'InUse' Field.
AvailList = myrodb.RODB_GetFields(elem, (uint)RecordType.Schema);
InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList, "FieldsInUse", ref dummy, false);
//if any ROField items are in use,
//use LINQ to get a string array of the FieldNames
if (InUseList.Count > 0)
{
string[] InUseListFieldNames = InUseList.OfType<ROField>().Select(x => $"<{x.GetFieldname}>").ToArray();
AutoCompleteStringCollection allowedTypes = new AutoCompleteStringCollection();
allowedTypes.AddRange(InUseListFieldNames);
tbValue.AutoCompleteCustomSource = allowedTypes;
tbValue.AutoCompleteMode = AutoCompleteMode.Suggest;
tbValue.AutoCompleteSource = AutoCompleteSource.CustomSource;
}
}
private void FillInData()
{
this.tbGroup.Text = DetermineGroupName();
// get the accessory prefix & accessory vale. May need to walk up the tree for this.
// and for a new group, it needs to get it from the parent.
string accpref, accvalue;
accpref = elem.GetAttribute("AccPageIDPrefix");
accvalue = elem.GetAttribute("AccPageID");
VlnXmlElement parent;
parent = (VlnXmlElement) elem.ParentNode;
while (parent != null && (accpref == "" || accvalue==""))
{
// walk up tree to get parent.
if (accpref == "") accpref = parent.GetAttribute("AccPageIDPrefix");
if (accvalue == "") accvalue = parent.GetAttribute("AccPageID");
if (parent.Name != "RO_Root")
parent = (VlnXmlElement) parent.ParentNode;
else
parent = null;
}
if (accpref != "")
this.tbPrefix.Text = accpref;
else
this.tbPrefix.Text = "";
if (accvalue != "")
this.tbValue.Text = CvtFldToUserFld(accvalue);
else
this.tbValue.Text = "";
origGroup = this.tbGroup.Text;
origPrefix = this.tbPrefix.Text;
origValue = this.tbValue.Text;
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.lblGroup = new System.Windows.Forms.Label();
this.tbGroup = new System.Windows.Forms.TextBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.tbValue = new System.Windows.Forms.TextBox();
this.tbPrefix = new System.Windows.Forms.TextBox();
this.lblValue = new System.Windows.Forms.Label();
this.lblPrefix = new System.Windows.Forms.Label();
this.btnRODef = new System.Windows.Forms.Button();
this.btnSubDef = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// lblGroup
//
this.lblGroup.Location = new System.Drawing.Point(24, 8);
this.lblGroup.Name = "lblGroup";
this.lblGroup.Size = new System.Drawing.Size(56, 16);
this.lblGroup.TabIndex = 0;
this.lblGroup.Text = "Group:";
//
// tbGroup
//
this.tbGroup.Location = new System.Drawing.Point(88, 8);
this.tbGroup.Name = "tbGroup";
this.tbGroup.Size = new System.Drawing.Size(248, 22);
this.tbGroup.TabIndex = 1;
this.tbGroup.Text = "textBox1";
//
// groupBox1
//
this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
this.tbValue,
this.tbPrefix,
this.lblValue,
this.lblPrefix});
this.groupBox1.Location = new System.Drawing.Point(24, 56);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(312, 96);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Accessory Page Access";
//
// tbValue
//
this.tbValue.Location = new System.Drawing.Point(72, 56);
this.tbValue.Name = "tbValue";
this.tbValue.Size = new System.Drawing.Size(216, 22);
this.tbValue.TabIndex = 3;
this.tbValue.Text = "textBox1";
// tbPrefix
//
this.tbPrefix.Location = new System.Drawing.Point(72, 24);
this.tbPrefix.Name = "tbPrefix";
this.tbPrefix.Size = new System.Drawing.Size(216, 22);
this.tbPrefix.TabIndex = 2;
this.tbPrefix.Text = "textBox1";
//
// lblValue
//
this.lblValue.Location = new System.Drawing.Point(16, 56);
this.lblValue.Name = "lblValue";
this.lblValue.Size = new System.Drawing.Size(48, 16);
this.lblValue.TabIndex = 1;
this.lblValue.Text = "Value:";
//
// lblPrefix
//
this.lblPrefix.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblPrefix.Location = new System.Drawing.Point(16, 24);
this.lblPrefix.Name = "lblPrefix";
this.lblPrefix.Size = new System.Drawing.Size(48, 16);
this.lblPrefix.TabIndex = 0;
this.lblPrefix.Text = "Prefix:";
//
// btnRODef
//
this.btnRODef.Location = new System.Drawing.Point(24, 168);
this.btnRODef.Name = "btnRODef";
this.btnRODef.Size = new System.Drawing.Size(312, 24);
this.btnRODef.TabIndex = 3;
this.btnRODef.Text = "Referenced Object Definition...";
this.btnRODef.Click += new System.EventHandler(this.btnRODef_Click);
//
// btnSubDef
//
this.btnSubDef.Location = new System.Drawing.Point(24, 208);
this.btnSubDef.Name = "btnSubDef";
this.btnSubDef.Size = new System.Drawing.Size(312, 24);
this.btnSubDef.TabIndex = 4;
this.btnSubDef.Text = "Subgroup Definition ...";
this.btnSubDef.Click += new System.EventHandler(this.btnSubDef_Click);
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(24, 248);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(144, 24);
this.btnOK.TabIndex = 5;
this.btnOK.Text = "OK";
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(192, 248);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(144, 24);
this.btnCancel.TabIndex = 6;
this.btnCancel.Text = "Cancel";
//
// GroupDefFrm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
this.ClientSize = new System.Drawing.Size(368, 293);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.btnCancel,
this.btnOK,
this.btnSubDef,
this.btnRODef,
this.groupBox1,
this.tbGroup,
this.lblGroup});
this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Name = "GroupDefFrm";
this.Text = "Group Definition";
this.Activated += new EventHandler(tbValue_AddAutoComplete);
this.groupBox1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private bool ProcessRROAccPageIDChange(VlnXmlElement mnuele, string newtmpl)
{
bool success;
XmlNode chldnode = (XmlNode) mnuele.FirstChild;
VlnXmlElement echild;
while (chldnode != null)
{
if (chldnode is VlnXmlElement)
{
echild = (VlnXmlElement) chldnode;
if (echild.Name != "vlnGroup")
{
// If this is a group defintion subtree it will only have one
// child, which is the text definition for the subgroup. Don't
// include these in the tree.
int levelCnt = chldnode.ChildNodes.Count;
string TheMenuTitle = echild.GetAttribute("MenuTitle");
if ((levelCnt > 1) || (levelCnt==1 && !TheMenuTitle.Equals("")))
{
string accid = echild.GetAccPageIDString(newtmpl);
echild.SetAttribute("AccPageID",accid);
success = myrodb.RODB_WriteRO(echild);
if (success==false) return false;
}
}
}
chldnode = chldnode.NextSibling;
}
return true;
}
private bool UpdateAccPageID(VlnXmlElement grp, string newtmpl, VlnStatusMessage StatMsgWindow)
{
// For this group and below in the xml tree, update Accessory Page ID using the new
// template.
bool success;
string haskids;
string kidsloaded;
XmlNode node = (XmlNode) grp.FirstChild;
VlnXmlElement child;
while (node != null)
{
if (node is VlnXmlElement)
{
child = (VlnXmlElement) node;
// If this is a group menu edit, process group nodes, otherwise
// process rros.
if (child.Name == "vlnGroup")
{
haskids = child.GetAttribute("HasChild");
kidsloaded = child.GetAttribute("ChildLoaded");
if (haskids == "True" && kidsloaded == "False" )
{
elem.SetAttribute("TreeNotData","True");
myrodb.RODB_GetChildData(child,true);
child.SetAttribute("ChildLoaded","True");
}
StatMsgWindow.StatusMessage = child.GetAttribute("MenuTitle");
success = UpdateAccPageID(child, newtmpl, StatMsgWindow);
if (success == false) return false;
success = ProcessRROAccPageIDChange(grp, newtmpl);
if (success==false)return false;
}
}
node = node.NextSibling;
}
success = ProcessRROAccPageIDChange(grp, newtmpl);
if (success==false) return false;
return true;
}
private void btnOK_Click(object sender, System.EventArgs e)
{
// if the fields were disabled, just return. (Only need to check one of them)
if(this.tbGroup.Enabled == false)
{
this.Close();
return;
}
// is this is a database level group, and is a user defined type, the
// accessory page value, fields in use & group fields in use must all be set.
// (doesn't need a prefix.
if (elem.ParentNode.Name == "RO_Root" && dbtype==3) //3 is user defined.
{
string strattr;
strattr = elem.GetAttribute("FieldsInUse");
if (strattr == null || strattr=="")
{
MessageBox.Show("No fields defined for Referenced Objects","Group Definition Error");
return;
}
strattr = this.tbValue.Text;
if (strattr == null || strattr=="")
{
MessageBox.Show("No Value defined for this group","Group Definition Error");
return;
}
strattr = elem.GetAttribute("GroupFieldsInUse");
if (strattr == null || strattr=="")
{
MessageBox.Show("No fields defined for subgroup","Group Definition Error");
return;
}
}
bool modaccpageid=false;
bool modified=false;
if ((elem.HasAttribute("AccPageID")&&this.tbValue.Text!=origValue) || this.tbValue.Modified)
{
string dummy = ""; // need for RODB_GetFIeldsInUse call, won't be used.
ArrayList AvailList, InUseList;
//first see if it is a valid 'InUse' Field.
AvailList = myrodb.RODB_GetFields(elem, (uint) RecordType.Schema);
InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList,"FieldsInUse", ref dummy, false);
int chkbracketo, chkbracketc; // open & close bracket indexes
chkbracketo = this.tbValue.Text.IndexOf("<");
chkbracketc = this.tbValue.Text.IndexOf(">");
if (chkbracketo == -1 || chkbracketc == -1)
{
MessageBox.Show("Missing bracket (<or>) in value definition.");
return;
}
//if (chkbracketo != 0 || chkbracketc != this.tbValue.Text.Length-1)
//{
// MessageBox.Show("Value definition contains extraneous text.");
// return;
//}
// check for more than one field, don't allow this,
int twobrk = this.tbValue.Text.IndexOf("<",chkbracketo+1);
if (twobrk != -1)
{
MessageBox.Show("Cannot have two fields in accessory page id.");
return;
}
string val = this.tbValue.Text.Substring(chkbracketo+1,chkbracketc-chkbracketo-1);
// loop thru inuse list and see if it's there.
bool found = false;
for(int i=0; i<InUseList.Count; i++)
{
ROField rof = (ROField) InUseList[i];
string inusename = rof.GetFieldname;
if (inusename == val)
{
found = true;
break;
}
}
if (found == false)
{
MessageBox.Show(this.tbValue.Text+" not in InUse field list");
return;
}
modified = true;
modaccpageid=true;
StringBuilder accidattr = new StringBuilder();
if (chkbracketo>0)
accidattr.Append(this.tbValue.Text.Substring(0,chkbracketo+1)); // +1 include the "<"
else
accidattr.Append("<");
accidattr.Append(CvtUserFldToFld(this.tbValue.Text.Substring(chkbracketo+1,chkbracketc-chkbracketo-1)));
if (chkbracketc>this.tbValue.Text.Length)
accidattr.Append(this.tbValue.Text.Substring(chkbracketc+1,this.tbValue.Text.Length-chkbracketc+1));
else
accidattr.Append(">");
elem.SetAttribute("AccPageID",accidattr.ToString());
// elem.SetAttribute("AccPageID",CvtUserFldToFld(this.tbValue.Text));
}
if (this.tbGroup.Text != origGroup)
{
XmlNode tmpn = (XmlNode) elem;
// B2019-033 check if the xml node value has two '_'s instead of spaces.
// remove the replace each '__' with a space for the comparison
// save the changed text with the spaces instead of the underbars - spaces are OK in XLM values
string tmpstr = tmpn.FirstChild.Value;
string tmpstr2 = tmpn.FirstChild.Value.Replace(CvtUserFldToFld(origGroup), this.tbGroup.Text);
if (tmpstr == tmpstr2)
tmpstr2 = tmpn.FirstChild.Value.Replace(origGroup, this.tbGroup.Text);
tmpn.FirstChild.Value = tmpstr2; //tmpn.FirstChild.Value.Replace(CvtUserFldToFld(origGroup), this.tbGroup.Text);
modified=true;
}
if ((elem.HasAttribute("AccPageIDPrefix")&&this.tbPrefix.Text != origPrefix) || this.tbPrefix.Modified==true)
{
elem.SetAttribute("AccPageIDPrefix",this.tbPrefix.Text);
modified=true;
}
bool success=true;
if (modified==true) success = myrodb.RODB_WriteRO(elem);
if (modified == true && success == true && modaccpageid==true)
{
Cursor.Current = Cursors.WaitCursor;
VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of Accessory Page ID Change");
success = UpdateAccPageID(elem, this.tbValue.Text,StatMsgWindow);
Cursor.Current = Cursors.Default;
StatMsgWindow.Dispose();
}
if (success == false)
MessageBox.Show("Could not save data.");
this.Close();
}
private void btnRODef_Click(object sender, System.EventArgs e)
{
RODefFrm rodef = new RODefFrm(elem,myrodb,"FieldsInUse", this.tbGroup.Text, dbtype);
rodef.ShowDialog();
// get accpageid, in case field name changed.
string accvalue = elem.GetAttribute("AccPageID");
VlnXmlElement parent;
parent = (VlnXmlElement) elem.ParentNode;
while (parent != null && accvalue=="")
{
// walk up tree to get parent.
if (accvalue == "") accvalue = parent.GetAttribute("AccPageID");
if (parent.Name != "RO_Root")
parent = (VlnXmlElement) parent.ParentNode;
else
parent = null;
}
if (accvalue != "")
this.tbValue.Text = CvtFldToUserFld(accvalue);
else
this.tbValue.Text = "";
}
private void btnSubDef_Click(object sender, System.EventArgs e)
{
RODefFrm rodef = new RODefFrm(elem,myrodb,"GroupFieldsInUse", this.tbGroup.Text, dbtype);
rodef.ShowDialog();
}
}
}