ArcObjects(9.3.1 SDK)とC#.Netを使用して、ArcGIS for Desktopで実行するユーティリティを作成しています。私のプロトタイプには、2つのコンボボックスとツールを備えたツールバーが含まれています。最初のコンボは目次のレイヤーを選択し、2番目のコンボは選択したレイヤーからフィールドを選択します。このツールは、地図を操作するために使用されます。
基本的に、レイヤーを選択し、有効なフィールドを選択してから、マップ内のフィーチャをクリックして、選択したフィールドの値を取得します。役立つ場合は、ツールバーの画像を次に示します。
[質問はここからほぼ完全に書き直されました]
私が抱えている問題は、ネイティブCOM UIパーツとカスタム.Netコントロールの間で状態を渡すことです。たとえば、レイヤーコンボボックスでDropDownClosedイベントをキャッチし、そのレイヤーに関連する列の有効なリストをアセンブルし、フィールド名のリストを(IFieldsを介して)フィールドコンボボックスに適用します。
RagiYaserBurhamとblah238による最初のコメントを適用し、これらをこのページの詳細とマージした後、次のDropDownClosedイベントハンドラーはコンボボックスからツールバー(ICommandBar)に戻りますが、ICommandItemからキャストする方法がわかりませんUserControlのFieldsコンボボックスの実装に:
private void layerSelectCBO_DropDownClosed(object sender, EventArgs e)
{
_completionNotify.SetComplete();
string layerName = (sender as ComboBox).SelectedItem as string;
// These two lines are a combination of initial commenter suggestions.
ICommandItem toolbar = _iApp.Document.CommandBars.Find("ArcProject.UI.AngryToolbar", false, false);
ICommandItem fieldsItem = (toolbar as ICommandBar).Find("ArcProject.UI.FieldSelectUC", false);
}
では、ここに来たので、fieldsItemをFieldSelectUCにキャストするにはどうすればよいですか。
[ ソリューション ]
blah238が示唆したように、私はICommandItem.CommandをカスタムのUserControl実装にキャストしてみましたが、それでうまくいきました。
まず、FieldSelectUC
ComboBoxへの参照を返すために、UserControlにパブリックアクセサーを追加する必要がありました。その単純なアクセサーは次のようになります。
// fieldSelectCBO is the name of the combobox control in the design view..
public ComboBox FieldsComboBox { get { return fieldSelectCBO; } }
その変更を行った後、選択したレイヤーのすべてのフィールドをフィールドコンボボックスに入力するDropDownClosedイベントハンドラーを次に示します。
private void layerSelectCBO_DropDownClosed(object sender, EventArgs e)
{
_completionNotify.SetComplete();
string layerName = (sender as ComboBox).SelectedItem as string;
// get the toolbar..
ICommandItem toolbar = _iApp.Document.CommandBars.Find("ArcProject.UI.AngryToolbar", false, false);
// get my fields combo by way of CommandItem.Command..
ICommandItem fieldsCI = (toolbar as ICommandBar).Find("ArcProject.UI.FieldSelectUC", false);
FieldSelectUC fieldsUC = fieldsCI.Command as FieldSelectUC;
ComboBox fieldsComboBox = fieldsUC.FieldsComboBox;
// get the fields for the selected layer..
IFields fields = null;
int layerCount = _iDoc.FocusMap.LayerCount;
int i;
for (i = 0; i < layerCount; i++)
{
if (_iDoc.FocusMap.get_Layer(i).Name == layerName)
{
if (_iDoc.FocusMap.get_Layer(i) is FeatureLayer)
{
fields = (_iDoc.FocusMap.get_Layer(i) as FeatureLayer).FeatureClass.Fields;
}
}
}
// Build a list of field names for the combobox items..
List<string> fieldNameList = new List<string>();
if (fields != null)
{
int fieldCount = fields.FieldCount;
int j;
for (j = 0; j < fieldCount; j++)
{
string oneFieldName = fields.get_Field(j).Name;
fieldNameList.Add(oneFieldName);
}
}
// Populate the combobox items..
if (fieldNameList.Count > 0)
{
fieldsComboBox.Items.Clear();
foreach (string fieldName in fieldNameList)
{
fieldsComboBox.Items.Add(fieldName);
}
fieldsComboBox.SelectedItem = fieldsComboBox.Items[0];
}
else
{
fieldsComboBox.Items.Add("Error: No fields!");
}
}
これはまだ汚いテストベッドです(したがってAngryToolbar)。しかし、このソリューションは、ICommandとIToolControlを実装する拡張されたUserControlから開始し、.Netコンポーネントにドリルダウンする方法を示しています。私は提案を提供してくれたすべての人の支援に本当に感謝しています。本当にありがとう。:)