protected override void OnClick() { m_pApp = (IApplication)ArcMap.Application; if (m_pApp == null) //if the app is null then could be running from ArcCatalog m_pApp = (IApplication)ArcCatalog.Application; if (m_pApp == null) { MessageBox.Show("Could not access the application.", "No Application found"); return; } IGxApplication pGXApp = (IGxApplication)m_pApp; stdole.IUnknown pUnk = null; try { pUnk = (stdole.IUnknown)pGXApp.SelectedObject.InternalObjectName.Open(); } catch (COMException ex) { if (ex.ErrorCode == (int)fdoError.FDO_E_DATASET_TYPE_NOT_SUPPORTED_IN_RELEASE || ex.ErrorCode == -2147220944) MessageBox.Show("The dataset is not supported in this release.", "Could not open the dataset"); else MessageBox.Show(ex.ErrorCode.ToString(), "Could not open the dataset"); return; } if (pUnk is ICadastralFabric) m_pCadaFab = (ICadastralFabric)pUnk; else { MessageBox.Show("Please select a parcel fabric and try again.", "Not a parcel fabric"); return; } IMouseCursor pMouseCursor = new MouseCursorClass(); pMouseCursor.SetCursor(2); Utils FabricUTILS = new Utils(); ITable pTable = m_pCadaFab.get_CadastralTable(esriCadastralFabricTable.esriCFTParcels); IDataset pDS = (IDataset)pTable; IWorkspace pWS = pDS.Workspace; bool bIsFileBasedGDB = true; bool bIsUnVersioned = true; FabricUTILS.GetFabricPlatform(pWS, m_pCadaFab, out bIsFileBasedGDB, out bIsUnVersioned); //Do a Start and Stop editing to make sure we're not running in an edit session if (!FabricUTILS.StartEditing(pWS, true)) {//if start editing fails then bail if (pUnk != null) Marshal.ReleaseComObject(pUnk); Cleanup(pMouseCursor, null, pTable, null, pWS, null, true); FabricUTILS = null; return; } FabricUTILS.StopEditing(pWS); ITable pPlansTable = m_pCadaFab.get_CadastralTable(esriCadastralFabricTable.esriCFTPlans); ITable pParcelsTable = m_pCadaFab.get_CadastralTable(esriCadastralFabricTable.esriCFTParcels); m_pProgressorDialogFact = new ProgressDialogFactoryClass(); m_pTrackCancel = new CancelTrackerClass(); m_pStepProgressor = m_pProgressorDialogFact.Create(m_pTrackCancel, m_pApp.hWnd); IProgressDialog2 pProgressorDialog = (IProgressDialog2)m_pStepProgressor; int iRowCount = pPlansTable.RowCount(null); int iRowCount2 = pParcelsTable.RowCount(null); m_pStepProgressor.MinRange = 1; m_pStepProgressor.MaxRange =iRowCount + iRowCount2; m_pStepProgressor.StepValue = 1; pProgressorDialog.Animation = ESRI.ArcGIS.Framework.esriProgressAnimationTypes.esriProgressSpiral; pProgressorDialog.ShowDialog(); m_pStepProgressor.Message = "Searching " + iRowCount2.ToString() + " parcel records..."; int iFixCnt = 0; //load all the plan names into a string array ArrayList NoPlanParcels = new ArrayList(); ArrayList NoPlanParcelsGrouped = new ArrayList(); ArrayList PlansList = new ArrayList(); Dictionary<int, int> ParcelLookup = new Dictionary<int, int>(); if (!FindNoPlanParcels(pPlansTable, pParcelsTable, ref PlansList, ref NoPlanParcels, ref NoPlanParcelsGrouped, ref ParcelLookup, out iFixCnt)) { pProgressorDialog.HideDialog(); if (iFixCnt > 0) MessageBox.Show("Canceled searching for parcels with no plan.", "Fix Parcels With No Name"); NoPlanParcels = null; Cleanup(pMouseCursor, null, pTable, pPlansTable, pWS, pProgressorDialog, true); return; } m_pStepProgressor.Message = "Search complete."; NoPlanParcels.Sort(); dlgFixParcelsWithNoPlan MissingPlansDialog = new dlgFixParcelsWithNoPlan(); FillTheList(MissingPlansDialog.listView1, NoPlanParcels); FillTheList(MissingPlansDialog.listViewByGroup, NoPlanParcelsGrouped); FillTheListBox(MissingPlansDialog.listPlans, PlansList); MissingPlansDialog.ThePlansList = PlansList; MissingPlansDialog.label1.Text = "Found " + iFixCnt.ToString() + " parcels that have a missing plan record."; MissingPlansDialog.lblSelectionCount.Text = "(" + iFixCnt.ToString() + " of " + iFixCnt.ToString() + " selected to fix)"; //cleanup Cleanup(null, null, null, null, null, pProgressorDialog, false); DialogResult dResult = MissingPlansDialog.ShowDialog(); if (dResult == DialogResult.Cancel) { Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); return; } //re-initilize the progressor m_pProgressorDialogFact = new ProgressDialogFactoryClass(); m_pTrackCancel = new CancelTrackerClass(); m_pStepProgressor = m_pProgressorDialogFact.Create(m_pTrackCancel, m_pApp.hWnd); pProgressorDialog = (IProgressDialog2)m_pStepProgressor; m_pStepProgressor.MinRange = 1; m_pStepProgressor.MaxRange = MissingPlansDialog.listView1.CheckedItems.Count; m_pStepProgressor.StepValue = 1; pProgressorDialog.Animation = ESRI.ArcGIS.Framework.esriProgressAnimationTypes.esriProgressSpiral; pProgressorDialog.ShowDialog(); m_pStepProgressor.Message = "Fixing parcels without a plan..."; if (!FabricUTILS.StartEditing(pWS, bIsUnVersioned)) { pProgressorDialog.HideDialog(); Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); FabricUTILS = null; return; } int iNewPlanID = 0; //Need to collect the choices from the UI and write the results to the DB ICadastralFabricSchemaEdit2 pSchemaEd = (ICadastralFabricSchemaEdit2)m_pCadaFab; if (MissingPlansDialog.radioBtnExistingPlan.Checked) {//Get the id of the EXISTING Plan string sPlanString = MissingPlansDialog.listPlans.SelectedItem.ToString(); string[] sPlanOID = Regex.Split(sPlanString, "oid:"); sPlanOID[1].Trim(); iNewPlanID = Convert.ToInt32(sPlanOID[1].Remove(sPlanOID[1].LastIndexOf(")"))); } Dictionary<string, int> PlanLookUp= new Dictionary<string,int>(); ArrayList iUnitsAndFormat = new ArrayList(); iUnitsAndFormat.Add(m_AngleUnits); iUnitsAndFormat.Add(m_AreaUnits); iUnitsAndFormat.Add(m_DistanceUnits); iUnitsAndFormat.Add(m_DirectionFormat); iUnitsAndFormat.Add(m_LineParams); if (MissingPlansDialog.radioBtnUserDef.Checked) { //create a NEW plan named with user's entered text ArrayList sPlanInserts = new ArrayList(); pSchemaEd.ReleaseReadOnlyFields(pPlansTable, esriCadastralFabricTable.esriCFTPlans); //release safety-catch sPlanInserts.Add(MissingPlansDialog.txtPlanName.Text); FabricUTILS.InsertPlanRecords(pPlansTable, sPlanInserts,iUnitsAndFormat,PlansList, bIsUnVersioned, null, null, ref PlanLookUp); if (!PlanLookUp.TryGetValue(MissingPlansDialog.txtPlanName.Text, out iNewPlanID)) { Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); FabricUTILS = null; return; } } if (MissingPlansDialog.radioBtnPlanID.Checked) {//create multiple new plans for each PlanID ArrayList sPlanInserts = new ArrayList(); foreach (ListViewItem listItem in MissingPlansDialog.listViewByGroup.CheckedItems) sPlanInserts.Add("[" + listItem.SubItems[0].Text + "]"); pSchemaEd.ReleaseReadOnlyFields(pPlansTable, esriCadastralFabricTable.esriCFTPlans); //release safety-catch FabricUTILS.InsertPlanRecords(pPlansTable, sPlanInserts, iUnitsAndFormat, PlansList, bIsUnVersioned, null, null, ref PlanLookUp); } ArrayList sParcelUpdates = new ArrayList(); sParcelUpdates.Add(""); int i = 0; int iCnt = 0; int iTokenLimit = 995; foreach (ListViewItem listItem in MissingPlansDialog.listView1.CheckedItems) { string s = listItem.SubItems[1].Text; string[] sItems = Regex.Split(s, "id:"); if (iCnt >= iTokenLimit)//time to start a new row { sParcelUpdates.Add("");//add a new item to the arraylist iCnt = 0;//reset token counter i++;//increment array index } sItems[1] = sItems[1].Remove(sItems[1].LastIndexOf(")")); if (iCnt == 0) sParcelUpdates[i] += sItems[1]; else sParcelUpdates[i] += "," + sItems[1]; iCnt++; } //============edit block========== try { pSchemaEd.ReleaseReadOnlyFields(pTable, esriCadastralFabricTable.esriCFTParcels); //release safety-catch if (MissingPlansDialog.radioBtnUserDef.Checked || MissingPlansDialog.radioBtnExistingPlan.Checked) { if (!FabricUTILS.UpdateParcelRecords(pTable, sParcelUpdates, iNewPlanID, bIsUnVersioned, m_pStepProgressor, m_pTrackCancel)) { pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTParcels); pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTPlans); FabricUTILS.AbortEditing(pWS); Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); FabricUTILS = null; return; } } if (MissingPlansDialog.radioBtnPlanID.Checked) { if (!FabricUTILS.UpdateParcelRecordsByPlanGroup(pTable, sParcelUpdates, PlanLookUp, ParcelLookup, bIsUnVersioned, m_pStepProgressor, m_pTrackCancel)) { pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTParcels); pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTPlans); FabricUTILS.AbortEditing(pWS); Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); FabricUTILS = null; return; } } pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTParcels); pSchemaEd.ResetReadOnlyFields(esriCadastralFabricTable.esriCFTPlans); FabricUTILS.StopEditing(pWS); //Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); //FabricUTILS = null; } catch (COMException Ex) { MessageBox.Show(Ex.ErrorCode.ToString() +":" + Ex.Message,"Fix Missing Plans"); } finally { Cleanup(null, null, pTable, pPlansTable, pWS, pProgressorDialog, true); FabricUTILS = null; } }