Ich erstelle ein Dienstprogramm zur Ausführung in ArcGIS for Desktop mit ArcObjects (9.3.1 SDK) und C # .Net. Mein Prototyp enthält eine Symbolleiste mit zwei Kombinationsfeldern und einem Werkzeug. Die erste Kombination wählt eine Ebene im Inhaltsverzeichnis aus, und die zweite wählt ein Feld aus der ausgewählten Ebene aus. Das Tool wird verwendet, um mit der Karte zu interagieren.
Grundsätzlich möchte ich einen Layer auswählen, ein gültiges Feld auswählen, dann auf ein Feature in der Karte klicken und dessen Wert für das ausgewählte Feld abrufen. Hier ist ein Bild der Symbolleiste, wenn es hilft:
[Frage von hier unten fast vollständig umformuliert]
Das Problem besteht darin, den Status zwischen den nativen COM-UI-Teilen und meinen benutzerdefinierten .NET-Steuerelementen zu übergeben. Ich möchte beispielsweise das DropDownClosed-Ereignis in der Layer-Combobox abfangen, eine gültige Liste von Spalten relativ zu dieser Ebene zusammenstellen und dann die Liste der Feldnamen (über IFields) auf die Fields-Combobox anwenden.
Nachdem einige der ersten Kommentare von RagiYaserBurham und blah238 angewendet und mit Details auf dieser Seite zusammengeführt wurden , wechselt der folgende DropDownClosed-Ereignishandler von der Combobox zurück zur Symbolleiste (ICommandBar), aber ich verstehe nicht, wie ich ICommandItem zurücksetzen kann zu meiner Implementierung der Fields-Combobox in einem UserControl:
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);
}
Also ... jetzt wo ich hier bin ... wie kann ich fieldsItem in FieldSelectUC umwandeln?
[ Die Lösung ]
Wie von blah238 vorgeschlagen, habe ich versucht, ICommandItem.Command in meine benutzerdefinierte UserControl-Implementierung zu übertragen, und das hat den Trick getan.
Zuerst musste ich meinem FieldSelectUC
UserControl einen öffentlichen Accessor hinzufügen , um einen Verweis auf seine ComboBox zurückzugeben. Dieser einfache Accessor sieht folgendermaßen aus:
// fieldSelectCBO is the name of the combobox control in the design view..
public ComboBox FieldsComboBox { get { return fieldSelectCBO; } }
Mit dieser Änderung finden Sie hier einen DropDownClosed-Ereignishandler, der die Combobox "Felder" mit allen Feldern der ausgewählten Ebene füllt:
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!");
}
}
Dies ist immer noch eine schmutzige Testumgebung (daher AngryToolbar). Die Lösung zeigt jedoch, wie Sie von einem erweiterten UserControl ausgehen, das ICommand und IToolControl implementiert, und einen Drilldown zu einer .NET-Komponente durchführen. Ich bin sehr dankbar für die Unterstützung aller, die Vorschläge gemacht haben. Vielen Dank. :) :)