2

propertygridでアイテムを定義します。私のコードはここにあります:

[DisplayName("Title of book"), CategoryAttribute("Books")]
public string BookName{ get; set; }

このコードを使用すると、propertygridからこのアイテムのラベルと値を取得できます(この例の場合:本のタイトルとその値(例)Learning C#):

private void button1_Click(object sender, EventArgs e)
{
    GridItem gi = propertyGrid1.SelectedGridItem;
    while (gi.Parent != null)
    {
        gi = gi.Parent;
    }
    foreach (GridItem item in gi.GridItems)
    {
        ParseGridItems(item); //recursive
    }
}

private void ParseGridItems(GridItem gi)
{
    if (gi.GridItemType == GridItemType.Category)
    {
        foreach (GridItem item in gi.GridItems)
        {
            ParseGridItems(item);
        }
    }
    textBox1.Text += "Lable : "+gi.Label + "\r\n";
    if(gi.Value != null)
        textBox1.Text += "Value : " + gi.Value.ToString() + "\r\n";
}

アイテム名を取得するにはどうすればよいですか?この例の場合:BookName

4

2 に答える 2

2

プロパティを使用GridItem.PropertyDescriptorします:

var propertyName = propertyGrid1.SelectedGridItem.PropertyDescriptor.Name;
于 2012-09-07T13:27:51.180 に答える
0

PropertyGridコントロールを継承すると、すべてのエントリを取得できます。継承されたクラスに、次の新しいプロパティを配置します。

public GridItem[] Items
    {
        get
        {
            try
            {
                System.Reflection.FieldInfo field_gridView = typeof(PropertyGrid).GetField("gridView", System.Reflection.BindingFlags.NonPublic
                    | System.Reflection.BindingFlags.Instance);

                object gridView = field_gridView.GetValue(this);

                System.Reflection.MethodInfo gridView_method_GetAllGridEntries = gridView.GetType().GetMethod("GetAllGridEntries", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new Type[0], null);

                object gridEntries_collection = gridView_method_GetAllGridEntries.Invoke(gridView, new object[0]);

                System.Reflection.MethodInfo gridEntries_collection_count_method = gridEntries_collection.GetType().GetMethod("get_Count");

                int count_entries = (int) gridEntries_collection_count_method.Invoke(gridEntries_collection, new object[0]);

                System.Reflection.MethodInfo gridEntries_collection_getItem_method = gridEntries_collection.GetType().GetMethod("get_Item", new Type[] { typeof(int) });

                GridItem[] entries = new GridItem[count_entries];

                for (int i = 0; i < count_entries; i++)
                {
                    entries[i] = gridEntries_collection_getItem_method.Invoke(gridEntries_collection, new object[] { i }) as GridItem;
                }

                return entries;
            }
            catch
            {
                throw;
            }
        }
    }

それがお役に立てば幸いです、アンベン。

于 2014-02-19T15:34:01.687 に答える