0

トピックが示唆しているように、PropertyInfo.SetValue に問題があります。要点を説明するために、ここに私の例を示します。私は独自のクラスを作成しましたが、その主なものはプレゼンテーション オブジェクトです。

using System;
using System.Reflection;

namespace TestingSetValue
{
public class Link
{
    private object presentationObject = null;
    private string captionInternal = string.Empty;

    public Link (string caption)
    {
        captionInternal = caption;
    }

    public string CaptionInternal
    {
        get { return captionInternal; }
        set { captionInternal = value; }
    }

    public bool Visible
    {
        get 
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    return Convert.ToBoolean(pi.GetValue(PresentationObject, null));
                }
            }

            return true;
        }

        set
        {
            if (PresentationObject != null)
            {
                PropertyInfo pi = PresentationObject.GetType().GetProperty("Visible");

                if (pi != null)
                {
                    pi.SetValue(PresentationObject, (bool)value, null);
                }
            }
        }
    }

    public object PresentationObject
    {
        get { return presentationObject; }
        set { presentationObject = value; }
    }

}

}

次に、これを行います:

private void btnShowLink_Click(object sender, EventArgs e)
    {
        Link link = new Link("Here I am!");

        this.contextMenu.Items.Clear();
        this.contextMenu.Items.Add(link.CaptionInternal);

        link.PresentationObject = this.contextMenu.Items[0];
        link.Visible = true;

        lblCurrentVisibility.Text = link.Visible.ToString();
    }

これはあまり論理的/経済的ではないように見えますが、実際の問題の本質を示しています。つまり、次の呼び出しを行った後、プレゼンテーション オブジェクトの可視性 (および link.Visible の値) が変更されないのはなぜですか。

link.Visible = true;

この作業を行うために他に何をすべきかわかりません...どんな助けも大歓迎です。

さらに興味深いことに、プロパティ Enabled は期待どおりに動作します...

PropertyInfo pi = PresentationObject.GetType().GetProperty("Enabled");

Visible は実際には ToolStripDropDownItem 基本オブジェクトのプロパティであるのに対し、 Enabled は ToolStripDropDownItem の「直接」プロパティであるという事実に関連している可能性がありますか?

4

2 に答える 2

1

これがどのクラスであるかを前もって言っておけば、これを理解するのは簡単だったでしょうが、WinForms を意味すると推測できる ToolStripDropDownItem であることがわかりました。

あなたが見ているのは、ToolStripItem の Visible プロパティの奇妙さです。セッターとゲッターは直接結びついていません。MSDNによると

「Available プロパティは、ToolStripItem が表示されているかどうかを示し、Visible は ToolStripItem とその親が表示されているかどうかを示すという点で、Visible プロパティとは異なります。Available または Visible のいずれかを true または false に設定すると、他のプロパティが true または false に設定されます。 "

つまり、Visible プロパティの代わりに Available プロパティを使用する必要があります。

于 2011-07-15T18:44:49.647 に答える
1

http://msdn.microsoft.com/en-us/library/system.web.ui.control.visible.aspxを確認してください。たぶん、これが問題の原因です。

非常に重要な情報があります:

このプロパティが false の場合、サーバー コントロールはレンダリングされません。ページのレイアウトを整理するときは、これを考慮する必要があります。コンテナー コントロールがレンダリングされない場合、個々のコントロールの Visible プロパティを true に設定しても、コンテナー コントロールに含まれるコントロールはレンダリングされません。その場合、個々のコントロールは、明示的に true に設定した場合でも、Visible プロパティに対して false を返します。(つまり、親コントロールの Visible プロパティが false に設定されている場合、子コントロールはその設定を継承し、設定はローカル設定よりも優先されます。)

于 2011-07-15T18:06:20.467 に答える