2017-05-10 100 views
1

我在非鍵盤pc上創建觸摸應用程序,我使用PropertyGrid來管理用於存儲/保存應用程序配置的類。 我需要使用我創建的自定義鍵盤(不是系統的)將propertyline的行編輯爲UITypeEditor 現在,單擊右鍵時顯示​​自定義鍵盤。通過點擊PropertyGrid中的屬性文本框來顯示屬性編輯器

是否有可能顯示何時開始行編輯(如文本框輸入事件), 或當該行被選中?

回答

0

您在PropertyGrid中看到的編輯控件是GridViewEdit控件,它是PropertyGridView的子控件,它是PropertyGrid的子控件。

您可以找到編輯控件並將事件處理程序分配給其Enter事件。在這種情況下,您可以找到SelectedGridItem,然後致電其EditPropertyValue方法,該方法負責顯示UITypeEditor

private void propertyGrid1_SelectedObjectsChanged(object sender, EventArgs e) 
{ 
    var grid = propertyGrid1.Controls.Cast<Control>() 
     .Where(x => x.GetType().Name == "PropertyGridView").FirstOrDefault(); 

    var edit = grid.Controls.Cast<Control>() 
     .Where(x => x.GetType().Name == "GridViewEdit").FirstOrDefault(); 

    edit.Enter -= edit_Enter; 
    edit.Enter += edit_Enter; 
} 

private void edit_Enter(object sender, EventArgs e) 
{ 
    var item = this.propertyGrid1.SelectedGridItem; 
    if (item.GetType().Name == "PropertyDescriptorGridEntry") 
    { 
     var method = item.GetType().GetMethod("EditPropertyValue", 
      System.Reflection.BindingFlags.NonPublic | 
      System.Reflection.BindingFlags.Instance); 

     var grid = propertyGrid1.Controls.Cast<Control>() 
      .Where(x => x.GetType().Name == "PropertyGridView").FirstOrDefault(); 

     method.Invoke(item, new object[] { grid }); 
    } 
} 

注:模態編輯的Enter事件是煩人,並重復了一遍又一遍。爲了避免這種情況,您可以使用控件的事件Click

同樣作爲另一種選擇,您可以依靠SelectedGridItemChanged事件PropertyGrid並檢查e.NewSelection.GetType().Name == "PropertyDescriptorGridEntry"然後使用反射調用EditPropertyValue選定的網格項目。