2

ページが最初にロードされたときに非表示としてグリッドビューを含むユーザーコントロールを初期化しようとしています。ユーザーがページの「検索」ボタンをクリックすると、そのユーザーコントロール内にあるグリッドビューを表示したいと思います。ユーザーコントロールを表示および非表示にするためのさまざまな方法を試しました。ユーザー コントロールを div に配置してから、style="display: none" を使用して div を非表示として初期化し、コード ビハインドでスタイルを「ブロック」に変更しようとしました。私は2つのクラスを使用して、1つのクラスを表示なしに設定し、もう1つのクラスを表示をブロックに設定し、ユーザーが「検索」ボタンをクリックすることに基づいてこれら2つのクラスを切り替えてみました。パネルを使用して、その可視性を true/false に設定しようとしましたが、しかし、ユーザーが [検索] ボタンをクリックした後に可視性を true に設定すると、パネルは表示されません。パネルとその可視性オプションを使用することを除いて、私が試したすべての方法で、次の例外が発生します。

{InnerText = '((System.Web.UI.HtmlControls.HtmlContainerControl)(divGrid)).InnerText' threw an exception of type 'System.Web.HttpException'}

これが私が使用しているコードで、このエラーの原因となっています:

マークアップ:

<div id="divGrid" runat="server">
    <uc1:ContactsGridUserControl ID="ContactsGridUserControl1" runat="server" UpdateMode="Conditional"/>      
</div> 

<asp:Button ID="btnSearch" runat="server" Text="Search" Font-Size="Small" Height="30px" 
                Width="67px" ClientIDMode="Static" onclick="btnSearch_Click"></asp:Button>

コードビハインド:

protected void btnSearch_Click(object sender, EventArgs e)
{
    //string redirect = CommonStrings.editContactPage;
    bool bStatus = false;

    try
    {
        bStatus = validateFields();

        if (bStatus)
        {
            divGrid.Style["display"] = "block";           

        }
        else
        {
            lblError.Text = "Please enter characters for at least one field below";

        }
    }
    catch (Exception ex)
    {
        lblError.Text = "Exception: " + ex.ToString();
    }
}

protected bool validateFields()
{
    try
    {
        if ((txtbxFirstName.Text != null && txtbxFirstName.Text.Length > 0) ||
            (txtbxLastName.Text != null && txtbxLastName.Text.Length > 0) ||
            (txtbxPhoneNum.Text != null && txtbxPhoneNum.Text.Length > 0) ||
            (txtbxCity.Text != null && txtbxCity.Text.Length > 0) ||
            (txtbxZipCode.Text != null && txtbxZipCode.Text.Length > 0) ||
            (txtDate1.Text != null && txtDate1.Text.Length > 0) ||
            (txtDate2.Text != null && txtDate2.Text.Length > 0) ||
            (txtbxCompanyName.Text != null && txtbxCompanyName.Text.Length > 0))
        {
            return true;

        }
        else
        {
            return false;
        }
    }
    catch (Exception ex)
    {
        lblError.Text = "Exception: " + ex.ToString();
        return false;
    }
}

完全なスタック トレース: (Visual Studio 内で [コール スタック ウィンドウ] を右クリックし、[外部コードを表示] を選択しました。デフォルト)

App_Web_gjla55xr.dll!AdvancedSearch.btnSearch_Click(オブジェクト送信者, System.EventArgs e) 50 行目 C# System.Web.dll!System.Web.UI.WebControls.Button.OnClick(System.EventArgs e) + 0x77 バイト
System.Web.dll !System.Web.UI.WebControls.Button.RaisePostBackEvent(string eventArgument) + 0x71 バイト
System.Web.dll!System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument) + 0xbバイト
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl, string eventArgument) + 0xe バイト
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System. Collections.Specialized.NameValueCollection (postData) + 0x25 バイト
System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint、bool includeStagesAfterAsyncPoint) + 0x15bc バイト
System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint、bool includeStagesAfterAsyncPoint) + 0x8d バイト
System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x4f バイト System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext コンテキスト) + 0x16 バイト
System.Web. dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext コンテキスト) + 0x32 バイト
App_Web_gjla55xr.dll!ASP.advancedsearch_aspx.ProcessRequest(System.Web.HttpContext コンテキスト) + 0x33 バイト C# System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x65 バイト システム.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep ステップ、ref bool completedSynchronously) + 0x4c バイト System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception エラー) + 0x13e バイト
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext コンテキスト、System.AsyncCallback cb、オブジェクト extraData) + 0xf8 バイト
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr) + 0x1a2 バイト System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x7d バイト
システム。 Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 バイト
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x17b バイト WebDev.WebHost40.dll!Microsoft. VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn) + 0x6c バイト
[Appdomain 遷移]
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(オブジェクトを受け入れたソケット) + 0x83 バイト
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(オブジェクトの状態) + 0x2d バイト+ 0xb0 バイト
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x5a バイト mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 バイト
mscorlib.dll!System.Threading._ThreadPoolWaitCallback .PerformWaitCallback() + 0x2d バイト
[マネージド トランジションにネイティブ]

編集:私は私の問題に対する答えを解決しました。ユーザー コントロールを ajax 更新パネルで囲み、検索ボタンのクリック イベントに asyncpostbacktrigger を接続する必要がありました。また、ユーザー コントロールを別のパネルで囲み、そのパネルの可視性をコード ビハインドから true/false に設定します。

更新されたコード:

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate>
        <asp:Panel ID="pnlGrid" Visible="false" runat="server">   
            <uc1:ContactsGridUserControl ID="ContactsGridUserControl1" runat="server" UpdateMode="Conditional"/>
        </asp:Panel>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
    </Triggers>

4

4 に答える 4

4

すべての ASP.NET WebForms コントロールの基本クラスは、 Visibleプロパティを持つ HtmlControl だと思います。これは機能しますか?:

divGrid.Visible = true; 
于 2012-06-22T19:32:11.427 に答える
1

私は自分の質問に対する答えを見つけました。ユーザー コントロールを更新パネルで囲み、トリガーを [検索] ボタンのクリック イベントに設定する必要がありました。また、ユーザーコントロールをパネルで囲み、表示を true/false に設定するだけです。

于 2012-06-22T21:00:29.707 に答える
0

私の記憶が正しければ、しばらく前に同様の問題がありました。それは、ページの読み込み時 (または起動時のある時点) でコントロールが表示されなかった場合に、ある時点で処理が機能しなかったことが原因でした。詳細は今のところよく覚えていません。

回避策:

  • ドキュメントの準備ができたらjqueryを使用して非表示にします
  • 「非表示」のときに要素の位置を画面から外し、表示したいときに元の場所に戻します

それでもうまくいかない場合は、完全なスタック トレースを投稿してください。

于 2012-06-22T19:27:16.140 に答える