0

ボタン1を持つ親ページPage1があります。Page1 にはユーザーコントロール uc1 があります。uc1 には、グリッド grid1 が存在する更新パネルがあります。uc1.grid1 の行コマンド イベント (行コマンド イベントには if 条件がいくつかあります) に応じて、Page1.button1 の可視性を false に設定しようとしています。次の方法で Page1.button1 の可視性を設定しています。

uc1 に IsButton1Visible プロパティを作成します。UC1.Grid1.RowCommand のプロパティを false に設定し、page1 PreRender イベントで IsButton1Visible にアクセスし、Page1.button1 の可視性を設定します。

クイック ウォッチでは Page1.button1 の可視性が割り当ての行で false に設定されていますが、UI を見るとまだ表示されています。何が間違っているのかわかりません。または、button1 を取得する方法とその可視性が正しくありません。

一般に、ユーザー コントロール イベント中にユーザー コントロールから親ページのコントロールのプロパティを設定できますか?

4

3 に答える 3

1

イベント ドリブン モデル アプローチを使用する場合

デリゲート/EventArgs コード:

public class ButtonVisiblityEventArgs : EventArgs
{
    public ButtonVisiblityEventArgs(bool visible)
    {
        this.Visiblity = visible;
    }

    public bool Visiblity { get; private set; }
}

public delegate void UpdateParentButtonVisibilityEventHandler(object sender, ButtonVisiblityEventArgs args);

ユーザー制御コード:

    public event UpdateParentButtonVisibilityEventHandler RaiseUpdateParentButtonVisibilityEvent;

    private void RequestParentButtonVisibilityChange(bool setVisible)
    {
        if (RaiseUpdateParentButtonVisibilityEvent != null)
        {
            RaiseUpdateParentButtonVisibilityEvent(this, new ButtonVisiblityEventArgs(setVisible));
        }
    }

そして、コマンド ハンドラーで次のように呼び出します。

    RequestParentButtonVisibilityChange(false);

ボタンを隠したいときはいつでも。あなたのページで:

    protected void Page_Load(object sender, EventArgs e)
    {
        this.RaiseUpdateParentButtonVisibilityEvent += new UpdateParentButtonVisibilityEventHandler(uc_RaiseUpdatecurrentDisplayPanelRequestEvent);
    }

    private void uc_RaiseUpdatecurrentDisplayPanelRequestEvent(object sender, ButtonVisiblityEventArgs args)
    {
        button1.Visible = args.Visiblity;
    }
于 2012-07-24T13:17:59.553 に答える
0

ボタンが更新パネルの外にあるという問題がある場合は、次の手順を実行できます。ページ コードバインド:

    protected void Page_Load(object sender, EventArgs e)
    {
        string hideScript = string.Format("function updateButtonVisibility( visibility ) {{ var button = $('#{0}'); if (visibility) {{ button.show(); }} else {{ button.hide(); }} }}", this.button1.ClientID);

        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "updateButtonVisibility", hideScript, true);

    }

そして、ユーザー コントロール コマンド ハンドラーで次のようにします。

   bool shouldButtonBeVisible = false; //update this appropriately in your logic
   ScriptManager.RegisterStartupScript(this, this.GetType(), "upUpdateButtonVisibility", "updateButtonVisibility(" + shouldButtonBeVisible ? "true" : "false" + ");", true);

これにより、UC とページの間に密接な依存関係が生じることに注意してください。このコントロールを使用するすべてのページで、このスクリプトが登録されている必要があります。これを回避する方法はいくつかありますが (関数スクリプト コールバックを呼び出すように設定する、その JavaScript 関数が存在するかどうかを検出するなど)、少なくともこれで動くはずです。

更新パネルが終了した後、キーオフできる特定の何かがページにある場合は、終了要求ハンドラーを登録することをお勧めします。

$(function() { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(updatePanelEndRequestHandler); } );

function updatePanelEndRequestHandler() {
   var shouldBeVisible = $('.MyClassThatSaysIShouldntAllowMoreButtons').length > 0; //do some checking on the grid
   updateButtonVisibility(shouldBeVisible);
}
于 2012-07-24T13:31:37.287 に答える