Tôi đang tạo một tiện ích để chạy trong ArcGIS for Desktop bằng ArcObjects (9.3.1 SDK) và C # .Net. Nguyên mẫu của tôi bao gồm một thanh công cụ với hai hộp tổ hợp và một công cụ. Combo đầu tiên chọn một lớp trong TOC và thứ hai chọn một trường từ lớp đã chọn. Công cụ sẽ được sử dụng để tương tác với bản đồ.
Về cơ bản tôi muốn chọn một lớp, chọn một trường hợp lệ, sau đó nhấp vào một tính năng trong bản đồ và nhận giá trị của nó cho trường đã chọn. Đây là hình ảnh của thanh công cụ, nếu nó giúp:
[câu hỏi gần như hoàn toàn được diễn đạt lại từ đây xuống]
Vấn đề tôi gặp phải là chuyển trạng thái giữa các phần COM UI gốc và các điều khiển .Net tùy chỉnh của tôi. Ví dụ: tôi muốn bắt sự kiện DropDownCloses trên hộp tổ hợp Lớp, tập hợp danh sách các cột hợp lệ liên quan đến lớp đó, sau đó áp dụng danh sách tên trường (thông qua IFields) vào hộp tổ hợp Trường.
Sau khi áp dụng một số nhận xét ban đầu của RagiYaserBurham và blah238, và hợp nhất chúng với các chi tiết từ trang này , trình xử lý sự kiện DropDownCloses sau sẽ chuyển từ combobox trở lại thanh công cụ (ICommandBar), nhưng tôi không hiểu làm thế nào để quay lại từ ICommandItem để tôi triển khai hộp tổ hợp Trường trong 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);
}
Vì vậy, bây giờ tôi đang ở đây .. làm cách nào để tạo các trườngItem cho FieldSelectUC?
[ Giải pháp ]
Như blah238 đã đề xuất, tôi đã thử truyền ICommandItem.Command cho triển khai UserControl tùy chỉnh của mình và điều đó đã tạo ra mánh khóe.
Đầu tiên, tôi phải thêm một trình truy cập công khai vào FieldSelectUC
UserControl của mình để trả về một tham chiếu đến ComboBox của nó; truy cập đơn giản đó trông như thế này:
// fieldSelectCBO is the name of the combobox control in the design view..
public ComboBox FieldsComboBox { get { return fieldSelectCBO; } }
Với sửa đổi đó, đây là trình xử lý sự kiện DropDownCloses sẽ điền vào hộp tổ hợp Trường với tất cả các trường của lớp đã chọn:
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!");
}
}
Đây vẫn là một thử nghiệm bẩn (do đó AngryToolbar). Nhưng giải pháp cho thấy cách bắt đầu từ UserControl mở rộng thực hiện ICommand và IToolControl và truy sâu xuống thành phần .Net. Tôi thực sự đánh giá cao sự giúp đỡ của tất cả những người đưa ra đề nghị. Cám ơn rất nhiều. :)