1

ページには、あるコントロールでは 'Visible' を false に設定し、別のコントロールでは true に設定するイベント ハンドラーがあります。デバッグをステップ実行すると、これらの値が適切に設定されていることがわかります。可視とマークされたコントロールは OnPreRender を通過しますが、非可視に設定したコントロールは通過しません。そのため、すべてが期待どおりに機能しているようです。ただし、リクエストが完了すると、ページの可視性はまったく変更されていません。直接の親 UpdatePanel を「常に」に設定しようとしましたが、手動で「Update()」を呼び出してみましたが、効果はありませんでした。ここで何が起こっているのか手がかりはありますか?

アップデート:

このすべてが機能しない原因は、ユーザー コントロールにプライベート プロパティを設定することだけであることがわかりました。そのコントロールの例と、プライベート フィールドを参照するすべての場所を含めました。

例:

protected override void OnLoad(EventArgs e)
{
    if (this.IsPostback)
    {
        return;
    }

    this.Control1.Visible = true;
    this.Control2.Visible = false;
}

protected void OnButtonClicked (object sender, EventArgs e)
{
    this.Control1.Visible = false;
    this.Control2.Visible = true;
    // this has desired results when it fires
}

protected void OnUserControlEventThatFiresAfterRowCommand (object sender, EventArgs e)
{
    this.Control2.SomeProp = this.GetSomeObject();

    this.Control1.Visible = false;
    this.Control2.Visible = true;
    // this does not have desired results, even though it does fire
}

そして Control2 で:

private SomeClass privatefield;

public SomeClass SomeProp
{
    get
    {
        return this.privatefield;
    }
    set
    {
        this.PopulateFields(value);

        this.privatefield = value;
        // If I comment out this line it works!
    }
}

protected override void LoadViewState(object savedState)
{
    object[] state = savedState as object[];

    base.LoadViewState(state[0]);
    this.Enabled = state[1] as bool? ?? true;
    this.SomeProp = state[2] as SomeClass;
    this.Visible = state[3] as bool? ?? true;
}

protected override object SaveViewState()
{
    return new object[]
    {
        base.SaveViewState(),
        this.Enabled,
        this.SomeProp,
        this.Visible
    };
}
4

1 に答える 1