Saya membuat utilitas untuk berjalan di ArcGIS untuk Desktop menggunakan ArcObjects (9.3.1 SDK) dan C # .Net. Prototipe saya melibatkan bilah alat dengan dua kotak kombo dan alat. Combo pertama memilih layer di TOC, dan yang kedua memilih field dari layer yang dipilih. Alat ini akan digunakan untuk berinteraksi dengan peta.
Pada dasarnya saya ingin memilih layer, pilih bidang yang valid, lalu klik fitur di peta dan dapatkan nilainya untuk bidang yang dipilih. Ini gambar toolbar, jika itu membantu:
[Pertanyaan hampir seluruhnya ditulis ulang dari sini ke bawah]
Masalah yang saya alami adalah melewati keadaan antara bagian asli COM UI dan kontrol .Net kustom saya. Misalnya, saya ingin menangkap acara DropDownClosed pada kotak kombo Layer, menyusun daftar kolom yang valid relatif terhadap lapisan itu, kemudian menerapkan daftar nama bidang (melalui IFields) ke kotak kombo Fields.
Setelah menerapkan beberapa komentar awal oleh RagiYaserBurham dan blah238, dan menggabungkannya dengan detail dari halaman ini , event handler DropDownClosed berikut ini pergi dari kotak kombo kembali ke bilah alat (ICommandBar), tapi saya tidak mengerti bagaimana cara melemparkan dari ICommandItem kembali untuk implementasi saya dari kotak kombo Fields di 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);
}
Jadi .. sekarang saya di sini .. bagaimana cara saya membuang fieldsItem ke FieldSelectUC?
[ Solusinya ]
Seperti yang disarankan blah238, saya mencoba melakukan casting ICommandItem.Command untuk implementasi UserControl kustom saya dan itu berhasil.
Pertama, saya harus menambahkan accessor publik ke FieldSelectUC
UserControl saya untuk mengembalikan referensi ke ComboBox-nya; bahwa pengakses sederhana terlihat seperti ini:
// fieldSelectCBO is the name of the combobox control in the design view..
public ComboBox FieldsComboBox { get { return fieldSelectCBO; } }
Dengan modifikasi itu di tempatnya, inilah event handler DropDownClosed yang akan mengisi kotak kombo Fields dengan semua bidang lapisan yang dipilih:
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!");
}
}
Ini masih testbed kotor (karenanya AngryToolbar). Tetapi solusinya menunjukkan bagaimana memulai dari UserControl yang diperluas yang mengimplementasikan ICommand dan IToolControl dan menelusuri kembali ke komponen .Net. Saya sangat menghargai bantuan semua orang yang menawarkan saran. Terima kasih banyak. :)