public static bool TableIsJoinLayer(ITable itable_0, ITable itable_1) { try { IDisplayTable table = itable_0 as IDisplayTable; if (table != null) { ITable displayTable = table.DisplayTable; string str = (itable_1 as IDataset).Name.ToLower(); while (displayTable is IRelQueryTable) { IRelQueryTable table3 = displayTable as IRelQueryTable; if ((table3.DestinationTable as IDataset).Name.ToLower() == str) { return(true); } displayTable = table3.SourceTable; } } return(false); } catch (COMException exception) { MessageBox.Show(exception.Message, "COM Error: " + exception.ErrorCode.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception exception2) { MessageBox.Show(exception2.Message, ".NET Error: ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } return(false); }
/// <summary> /// This function will check to make sure that the passed in layer is a valid SDE layer. /// It ensures that the layer is not: /// and that it is not /// 1). an XY event layer /// 2). in a relationship with a RESPONDER layer /// </summary> /// <param name="pLayer">the layer to validate</param> /// <returns>true / false (is valid / not valid)</returns> public static bool IsValidGisLayer(ILayer pLayer) { if (pLayer.Valid && pLayer is IGeoFeatureLayer) { // Skip the feature if it is an XY Event Source IGeoFeatureLayer pGfLayer = pLayer as IGeoFeatureLayer; if (pGfLayer.FeatureClass is IXYEventSource) { return(false); } // Skip the feature if it is joined to a Responder table IDisplayTable pDispTable = pLayer as IDisplayTable; if (pDispTable != null) { ITable pTable = pDispTable.DisplayTable; var table = pTable as IRelQueryTable; if (table != null) { IRelQueryTable pRelQueryTable = table; IObjectClass pClass = pRelQueryTable.DestinationTable as IObjectClass; if (pClass == null) { return(false); } } } //// See if the feature name is for a Service Location //string sName = pGfLayer.FeatureClass.AliasName; //if (sName == layerName) return(true); } return(false); }
/// <summary> /// Creates an enumeration of the <see cref="IRelQueryTable" />. /// </summary> /// <param name="source">The source.</param> /// <returns>Returns a <see cref="IEnumerable{IRelQueryTable}" /> representing the collection of tables.</returns> public static IEnumerable <IRelQueryTable> AsEnumerable(this IRelQueryTable source) { IRelQueryTable table = source; while (table != null) { yield return(table); table = table.SourceTable as IRelQueryTable; } }
private void btnRemoveJoining_Click(object sender, EventArgs e) { IDisplayTable table = this.itable_0 as IDisplayTable; ITable displayTable = table.DisplayTable; if (displayTable is IRelQueryTable) { string str = this.JoiningDataList.SelectedItem.ToString(); while (displayTable is IRelQueryTable) { IRelQueryTable table3 = displayTable as IRelQueryTable; if ((table3.DestinationTable as IDataset).Name == str) { break; } displayTable = table3.SourceTable; } if (displayTable is IRelQueryTable) { IRelQueryTable table5 = displayTable as IRelQueryTable; displayTable = table5.SourceTable; IDisplayRelationshipClass class2 = this.itable_0 as IDisplayRelationshipClass; if (displayTable is IRelQueryTable) { table5 = displayTable as IRelQueryTable; IRelQueryTableInfo info = table5 as IRelQueryTableInfo; class2.DisplayRelationshipClass(table5.RelationshipClass, info.JoinType); } else { class2.DisplayRelationshipClass(null, esriJoinType.esriLeftInnerJoin); } this.JoiningDataList.Items.Clear(); if (this.OnJoinAndRelationChange != null) { this.OnJoinAndRelationChange(); } this.method_1(this.itable_0); if (this.JoiningDataList.Items.Count > 0) { this.btnRemoveAllJoining.Enabled = true; } else { this.btnRemoveAllJoining.Enabled = false; } } } }
private void method_2(IDisplayRelationshipClass idisplayRelationshipClass_0, IRelQueryTable irelQueryTable_0) { try { IRelationshipClass relationshipClass = irelQueryTable_0.RelationshipClass; if (relationshipClass != null) { idisplayRelationshipClass_0.DisplayRelationshipClass(relationshipClass, idisplayRelationshipClass_0.JoinType); } } catch { } }
/// <summary> /// Sets a join based on the specified relationship class and join type. /// </summary> /// <param name="source">The source.</param> /// <param name="table">The table.</param> /// <param name="foreignClass">The join.</param> /// <param name="layerKeyField">Name of the layer field.</param> /// <param name="foreignKeyField">Name of the join field.</param> /// <param name="cardinality">The cardinality.</param> /// <param name="joinType">Type of the join.</param> /// <returns> /// Returns a <see cref="IRelQueryTable" /> represents the table and feature join. /// </returns> public static IRelQueryTable Add(this IFeatureLayer source, IRelQueryTable table, IObjectClass foreignClass, string layerKeyField, string foreignKeyField, esriRelCardinality cardinality, esriJoinType joinType) { if (source != null) { var factory = new RelQueryTableFactoryClass(); var origin = factory.Open(table.RelationshipClass, true, null, null, "", true, ((IRelQueryTableInfo)table).JoinType == esriJoinType.esriLeftInnerJoin); var join = ((IObjectClass)origin).Join(foreignClass, string.Format("{0}.{1}", ((IDataset)table.SourceTable).Name, layerKeyField), foreignKeyField, cardinality, null); var result = factory.Open(join, true, null, null, "", true, joinType == esriJoinType.esriLeftInnerJoin); IDisplayRelationshipClass display = (IDisplayRelationshipClass)source; display.DisplayRelationshipClass(result.RelationshipClass, joinType); return(result); } return(null); }
private void btnStatistics_Click(object sender, EventArgs e) { if (m_pCurFeaCls == null) { return; } this.Cursor = Cursors.WaitCursor; try { //空间过滤 IQueryFilter pQueryFilter = null; if (m_pGeometry != null) { ISpatialFilter pSpatialFilter = new SpatialFilterClass(); pSpatialFilter.Geometry = m_pGeometry; pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; pQueryFilter = pSpatialFilter as ISpatialFilter; } else { pQueryFilter = new QueryFilterClass(); } //属性条件 pQueryFilter.WhereClause = this.txtSQL.Text; IFeatureClass pFeaCls = m_pCurFeaCls; IRelQueryTable pRelQueryTable = pFeaCls as IRelQueryTable; if (pRelQueryTable != null) { IRelationshipClass pRelShip = pRelQueryTable.RelationshipClass; pFeaCls = pRelShip.OriginClass as IFeatureClass; } //初始化表 DataTable dt = InitDataTalbe(pFeaCls); //绑定 以便动态显示 this.gridRes.DataSource = dt; IFeatureCursor pFeaCursor = pFeaCls.Search(pQueryFilter, false); IFeature pFea = pFeaCursor.NextFeature(); while (pFea != null) { InsterFeaToTable(pFea, dt, m_pGeometry); pFea = pFeaCursor.NextFeature(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeaCursor); pFeaCursor = null; //计算面积综合 GetSum(dt, pFeaCls); //修饰表格 EditGrid(pFeaCls); //初始统计图的combobox InitChartWhere(); } catch (Exception ex) { } this.Cursor = Cursors.Default; }
/// <summary> /// 初始化符号信息 /// </summary> protected override void InitialSymbol() { base.InitialSymbol(); if (m_pUniqueRender == null || m_pFeatureLayer == null) { return; } //是否是多个字段 bool bNoSepFieldVal = false; //是否是连接表 bool bIsJoined = false; try { IDisplayTable pDisplayTable = m_pFeatureLayer as IDisplayTable; ITable pTable = pDisplayTable.DisplayTable; IDataset objDataset = m_FeatureClass as IDataset; //是否是关系表 if (pTable is IRelQueryTable) { bIsJoined = true; } if (FieldCount > 1) { bNoSepFieldVal = true; } //唯一值字段有多个 if (bNoSepFieldVal) { //数据源为SHAPE文件 if (objDataset.Workspace.Type == esriWorkspaceType.esriFileSystemWorkspace) { for (int i = 1; i <= FieldCount; i++) { FieldNames.Add(m_pUniqueRender.Field[i - 1].ToLower()); } CommStaticClass.GimmeUniqueValuesFromShape(m_FeatureClass as ITable, FieldNames); } //数据源为其他 else { for (int i = 1; i <= FieldCount; i++) { FieldNames.Add(m_pUniqueRender.Field[i - 1].ToLower()); //属性表有连接表 if (pTable is IRelQueryTable) { IRelQueryTable pRelQueryTable = default(IRelQueryTable); ITable pDestTable = default(ITable); IDataset pDataSet = default(IDataset); IList <string> alJoinedTableNames = new List <string>(); while (pTable is IRelQueryTable) { pRelQueryTable = pTable as IRelQueryTable; pDestTable = pRelQueryTable.DestinationTable; pDataSet = pDestTable as IDataset; pTable = pRelQueryTable.SourceTable; alJoinedTableNames.Add(pDataSet.Name); } CommStaticClass.GimmeUniqeValuesForFieldname(m_FeatureClass as ITable, m_pUniqueRender.Field[i - 1], alJoinedTableNames); pTable = pDisplayTable.DisplayTable; } //属性表没有连接表 else { CommStaticClass.GimmeUniqeValuesForFieldname(m_FeatureClass as ITable, m_pUniqueRender.Field[i - 1]); } } } } //唯一值字段只有一个 else { FieldNames.Add(m_pUniqueRender.Field[FieldCount - 1].ToLower()); } //开始解析符号 for (int j = 0; j <= ValueCount - 1; j++) { ISymbol pSymbol = m_pUniqueRender.get_Symbol(m_pUniqueRender.get_Value(j)); ptSymbolFactory pSymbolFac = new ptSymbolFactory(pSymbol); ptSymbolClass pSymbolClass = pSymbolFac.GetSymbolClass(m_pUniqueRender.Label[m_pUniqueRender.get_Value(j)], CommStaticClass.getUVFieldValues(m_pUniqueRender, j) , 0, 0); SymbolList.Add(pSymbolClass); } } catch (Exception ex) { ptLogManager.WriteMessage(string.Format("方法名称:{0}{1}{2}{3}{4}", "InitialSymbol", Environment.NewLine, ex.Message, Environment.NewLine, ex.StackTrace)); } }
/// <summary> /// 处理设置融合时FID、state不一致问题并修改核心日志记录表 /// </summary> /// <param name="pRelationshipClass">融合要素关系类</param> /// <param name="pTargetFeat">保留属性的要素</param> /// <param name="pDicFeature">融合要素集合</param> /// <param name="pRangeClss">图幅结合表</param> private void ChangeFeatureState(IRelationshipClass pRelationshipClass, IFeature pTargetFeat, Dictionary <int, IFeature> pDicFeature, IFeatureClass pRangeClss) { if (MoData.v_LogTable == null) { return; } if (MoData.v_LogTable.DbConn == null) { return; //日志记录表是否连接 } if (pDicFeature == null || pRelationshipClass == null || pRangeClss == null) { return; } Exception exError = null; IRelQueryTable pJionRelQueryTable = SysCommon.Gis.ModGisPub.GetRelQueryTable(pRelationshipClass, true, null, "STATE", false, true, out exError); IFeatureClass pFeatCls = pJionRelQueryTable as IFeatureClass; if (pFeatCls == null) { return; } IDataset pOriginIDataset = pRelationshipClass.OriginClass as IDataset; //要素类 if (pOriginIDataset == null) { return; } int indexOID = pFeatCls.Fields.FindField(pOriginIDataset.Name + ".OBJECTID"); int indexFID = pFeatCls.Fields.FindField(pOriginIDataset.Name + ".GOFID"); int indexState = pFeatCls.Fields.FindField(pRelationshipClass.DestinationClass.AliasName + ".STATE"); if (indexOID == -1 || indexFID == -1 || indexState == -1) { return; } object temp = pFeatCls.GetFeature(pTargetFeat.OID).get_Value(indexState); if (temp is DBNull) { temp = -1; //表示未变化 } int valueTargetState = Convert.ToInt32(temp); int valueTargetFID = Convert.ToInt32(pFeatCls.GetFeature(pTargetFeat.OID).get_Value(indexFID)); if (valueTargetState == 1 || valueTargetState == 2) //为发生变化的要素 { foreach (KeyValuePair <int, IFeature> keyValue in pDicFeature) { if (keyValue.Key == pTargetFeat.OID) { continue; //为保留属性的要素则跳到下个要素 } IFeature pTempFeature = pFeatCls.GetFeature(keyValue.Key); temp = pTempFeature.get_Value(indexState); if (temp is DBNull) { temp = -1; //表示未变化 } int valueState = Convert.ToInt32(temp); int valueFID = Convert.ToInt32(pTempFeature.get_Value(indexFID)); if (valueState == 1) {//该要素的State为新建,则删除该要素日志记录表中对应内容 string strCon = "LAYERNAME='" + pOriginIDataset.Name + "'and OID=" + pTempFeature.OID + " and STATE=1 and SAVE=1"; MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError); } else if (valueState == 2) {//该要素的State为修改 string strCon = "GOFID=" + valueFID + " and SAVE=1"; if (valueFID != valueTargetFID) {//该要素的FID与保留属性要素FID不同,则将该要素日志记录表中对应内容状态修改为删除 MoData.v_LogTable.UpdateTable("update UpdateLog set STATE=3 where " + strCon, out exError); } else {//则删除该要素日志记录表中对应内容 MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError); } } else { //该要素的State为未变化 if (valueFID != valueTargetFID) { //该要素的FID与保留属性要素FID不同,则在日志记录表中增加该要素对应内容状态为删除 string strSQL = "insert into UpdateLog(GOFID,STATE,SAVE) values(" + valueFID.ToString() + ",3,1)"; MoData.v_LogTable.UpdateTable(strSQL, out exError); } } } } else //为未发生变化的要素 { bool bAddLog = false; foreach (KeyValuePair <int, IFeature> keyValue in pDicFeature) { if (keyValue.Key == pTargetFeat.OID) { continue; //为保留属性的要素则跳到下个要素 } IFeature pTempFeature = pFeatCls.GetFeature(keyValue.Key); temp = pTempFeature.get_Value(indexState); if (temp is DBNull) { temp = -1; //表示未变化 } int valueState = Convert.ToInt32(temp); int valueFID = Convert.ToInt32(pTempFeature.get_Value(indexFID)); if (valueState == 1) {//该要素的State为新建,则删除该要素日志记录表中对应内容,并在日志记录表中增加保留属性要素对应内容状态为修改 string strCon = "LAYERNAME='" + pOriginIDataset.Name + "'and OID=" + pTempFeature.OID + " and STATE=1 and SAVE=1"; MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError); if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改 { string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)"; MoData.v_LogTable.UpdateTable(strSQL, out exError); bAddLog = true; } } else if (valueState == 2) {//该要素的State为修改 string strCon = "GOFID=" + valueFID + " and SAVE=1"; if (valueFID != valueTargetFID) {//该要素的FID与保留属性要素FID不同,则将该要素日志记录表中对应内容状态修改为删除 MoData.v_LogTable.UpdateTable("update UpdateLog set STATE=3 where " + strCon, out exError); } else {//则删除该要素日志记录表中对应内容 MoData.v_LogTable.UpdateTable("delete * from UpdateLog where " + strCon, out exError); } if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改 { string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)"; MoData.v_LogTable.UpdateTable(strSQL, out exError); bAddLog = true; } } else { //该要素的State为未变化,则增加日志记录表中对应内容状态为删除 if (valueFID != valueTargetFID) { //该要素的FID与保留属性要素FID不同,则在日志记录表中增加该要素应内容状态为删除 string strSQL = "insert into UpdateLog(GOFID,STATE,SAVE) values(" + valueFID.ToString() + ",3,1)"; MoData.v_LogTable.UpdateTable(strSQL, out exError); } if (bAddLog == false) //(只增加一次)在日志记录表中增加保留属性要素对应内容状态为修改 { string strSQL = "insert into UpdateLog(GOFID,LAYERNAME,OID,STATE,SAVE) values(" + valueTargetFID.ToString() + ",'" + pOriginIDataset.Name + "'," + pTargetFeat.OID + ",2,1)"; MoData.v_LogTable.UpdateTable(strSQL, out exError); bAddLog = true; } } } } }