2009-04-13 43 views
5

Tôi đang sử dụng PropertyGrid để hiển thị các thuộc tính từ đối tượng của mình. Tuy nhiên, tôi cũng cho phép người dùng tạo thuộc tính của riêng họ và đặt giá trị cho các thuộc tính tùy chỉnh này. Mỗi đối tượng có thể có các thuộc tính tùy chỉnh này có một bộ sưu tập từ điển, trong đó chuỗi là một khóa duy nhất để xác định thuộc tính và đối tượng là giá trị của kiểu nguyên thủy (chuỗi, bool, int, v.v.)Đặt lại thuộc tính từ lưới thuộc tính

I ' đã tạo ra một PropertyDescriptor tùy chỉnh với các phương thức get và set để kiểm tra từ điển cho một khóa khớp, hoặc tạo/ghi đè lên giá trị với một khóa tương ứng tương ứng.

Tuy nhiên, tôi cũng muốn cung cấp cho người dùng khả năng xóa thuộc tính và do đó xóa mục nhập của nó khỏi từ điển hoàn toàn. Tôi muốn đặt mã để điều này trong phương pháp ghi đè ResetValue của PropertyDescriptor tùy chỉnh của tôi, tuy nhiên tôi không thấy bất kỳ cách nào thông qua giao diện PropertyGrid để envoke này? Nó không có vẻ là một lựa chọn menu ngữ cảnh hoặc một cái gì đó hiển nhiên như thế.

Vì vậy, nếu tôi có một PropertyDescriptor tùy chỉnh với phương thức ResetValue tùy chỉnh, làm cách nào để thực sự gợi ra phương thức đó từ một PropertyGrid?

Trả lời

3

Tôi nghĩ rằng cách dễ nhất để đạt được điều này là thêm một ContextMenu vào lưới tài sản của bạn, với một mục trình đơn "Reset", và sau đó xử lý sự kiện click của nó như thế này:

private void resetToolStripMenuItem_Click(object sender, EventArgs e) 
{       
    PropertyDescriptor pd = propGrid.SelectedGridItem.PropertyDescriptor; 
    pd.ResetValue(propGrid.SelectedObject); 
} 

Tôi nghĩ rằng Visual Studio làm một cái gì đó như thế này.

+0

Ahh yeah Tôi chỉ tìm thấy bài này trên MSDN là tốt. Có vẻ như đó là lựa chọn tốt nhất. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Vâng, lệnh gọi propGri.SelectedGridItem.Select() có vẻ như sẽ cũng xóa một số vấn đề cập nhật. –

1

Chú thích: PropertyGrid.SelectedObject trả về Giá trị sai (thành phần) trong Childobjects. Do đó Phương thức CanResetValue đã nhận lại thành phần không chính xác.

Giải pháp của tôi:

private void OnContextMenuOpening(object sender, CancelEventArgs e) 
{ 
    var lGrid = mCurrentControl as PropertyGrid; 

    if (lGrid != null) 
    { 
    var lItem = lGrid.SelectedGridItem; 

    // Für untergeordnete Eigenschaften kann nicht SelectedObject verwendet werden 
    // Component ist eine interne Eigenschaft der Klasse System.Windows.Forms.PropertyGridInternal.GridEntry 
    // ((System.Windows.Forms.PropertyGridInternal.GridEntry)(lItem)).Component 
    // Zugriff via Reflection 
    var lComponent = lItem.GetType().GetProperty("Component").GetValue(lItem, null); 

    if (lComponent != null) 
     tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lComponent); 
    else 
     tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lGrid.SelectedObject); 
    } 
} 

// Contextmenu -> Reset 
private void OnResetProperty(object sender, EventArgs e) 
{ 
    var lGrid = mCurrentControl as PropertyGrid; 

    if (lGrid != null) 
    lGrid.ResetSelectedProperty(); 
} 
Các vấn đề liên quan