2012-06-22 4 views
2

페이지가 처음로드 될 때 숨겨진 것으로 gridview를 포함하는 usercontrol을 초기화하려고합니다. 사용자가 페이지에서 "검색"버튼을 클릭하면 그 usercontrol 내에있는 gridview를 보여주고 싶습니다. 나는 사용자 정의 컨트롤을 보이고 숨기기위한 여러 가지 방법을 시도했다. 나는 div에 usercontrol을 놓은 다음 style = "display : none"을 사용하여 div를 숨김으로 초기화하고 스타일을 'block'으로 변경하는 코드를 작성하려고했습니다. 하나의 클래스가 none으로 설정되고 다른 하나는 차단되도록 설정된 디스플레이로 2 개의 클래스를 사용하고 "검색"버튼을 클릭하는 사용자를 기반으로이 2 개의 클래스를 전환하여 시도했습니다. 패널을 사용하여 표시 여부를 true/false로 설정하려고했지만 사용자가 검색 버튼을 클릭 한 후 표시 여부를 true로 설정하면 패널이 표시되지 않습니다. 패널 및 가시성 옵션을 사용하여 제외하고 내가 해봤 모든 방법은, 나에게 다음과 같은 예외 제공 :숨겨진 div를 codebehind에서 표시하는 방법 C#

태그 :

{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에서 "외부 코드 표시"를 선택하십시오. 나는 내 문제에 대한 답변을 해결 : I는 전체 스택 추적을 표시하려면이 권한을 한 경우) 기본적으로 스택의 상단에 무엇을 보여주는에

App_Web_gjla55xr.dll!AdvancedSearch.btnSearch_Click(object sender, System.EventArgs e) Line 50 C# System.Web.dll!System.Web.UI.WebControls.Button.OnClick(System.EventArgs e) + 0x77 bytes
System.Web.dll!System.Web.UI.WebControls.Button.RaisePostBackEvent(string eventArgument) + 0x71 bytes
System.Web.dll!System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument) + 0xb bytes
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl, string eventArgument) + 0xe bytes
System.Web.dll!System.Web.UI.Page.RaisePostBackEvent(System.Collections.Specialized.NameValueCollection postData) + 0x25 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0x15bc bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0x8d bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x4f bytes System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) + 0x16 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0x32 bytes
App_Web_gjla55xr.dll!ASP.advancedsearch_aspx.ProcessRequest(System.Web.HttpContext context) + 0x33 bytes C# System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x65 bytes System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously) + 0x4c bytes System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x13e bytes
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0xf8 bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr) + 0x1a2 bytes System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x7d bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 bytes
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x17b bytes WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn) + 0x6c bytes
[Appdomain Transition]
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0x83 bytes
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state) + 0x2d bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x5a bytes mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes
[Native to Managed Transition]

편집을 반대로 나는 확실하지 않다. 나는 ajax 업데이트 패널로 사용자 정의 컨트롤을 둘러싸고 asyncpostbacktrigger를 검색 버튼 클릭 이벤트에 연결해야했습니다. 또한 다른 패널에 usercontrol을 둘러싸고 그 패널의 가시성을 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

당신의'div'는 클래스'hidden'을 가지고 있습니다 ... 아마도 당신은 그 클래스를 대신 제거해야합니까? –

+2

내부 예외가 있습니까? 스택을 보여주세요! – Charleh

+0

안녕하세요 제프, 숨겨진 수업을 삭제했습니다. 그 혼란에 대해 유감스럽게 생각합니다. 두 가지 클래스를 교환 할 때 시도한 다른 메소드에서 코드가 남았습니다. 하나의 클래스는 none으로 설정되고 다른 클래스는 표시되도록 설정되었습니다. 수업을 나가서 = 숨겨진 후 나는 여전히 같은 오류가 발생합니다. – jre247

답변

4

모든 ASP.NET WebForms 컨트롤의 기본 클래스는 Visible 속성을 가진 HtmlControl입니다. 이게 작동할까요? :

divGrid.Visible = true; 
+2

나는 그것을 시도했지만 div가 표시되지 않는 몇 가지 이유로. 난뿐만 아니라 패널을 사용하여 시도하고 사실로 표시하려고, 그리고 여전히 작동하지 않았다 – jre247

0

내가 바로 내가 잠시 다시 비슷한 문제가 있었다 및 컨트롤이 페이지로드에서 볼 수 아니었다면 그것은 어떤 시점이 작동하지에서 처리 때문이었다 기억한다면 (또는 시작할 때 어떤 지점). 나는 세부 사항을 지금 확실히 생각하지 않는다.

아이디어를 해결하려면 다음을 수행합니다

  • 사용 JQuery와 준비 문서에 그것을 숨길
  • 화면 오프 요소의 위치를 ​​할 때 "숨겨진"당신이 원하는 때가는 곳으로 다시 이동 그것을 표시하십시오

그 중 아무 것도 작동하지 않으면 전체 스택 추적을 게시하십시오.

+0

지금까지 도와 주셔서 감사합니다! 내가 그 제안을 시도하고, 불행히도 그들은 div를 숨길 것이지만 그것을 보여주지 않을 것이다. 위의 전체 스택 추적을 게시했습니다. 감사! – jre247

+0

코드 숨김이 어떤 식 으로든 컨트롤을 표시하지 않도록 설정했는지 다시 한번 확인하십시오. –

1

나는 내 질문에 대한 대답을 알아 냈습니다. 나는 사용자 패널을 업데이트 패널로 둘러 싸서 트리거를 검색 버튼의 클릭 이벤트로 설정해야했다. 나는 또한 userControl을 패널로 둘러싸고 단순히 true/false로 표시되도록 설정했습니다.

1

실제로이 문제가 발생합니다. Page_Load 이벤트에 divControl.Visible = false;을 사용했는데, 그 코드가 내 페이지 형식을 혼란스럽게 만드는 신비한 사고로 해결되었습니다. 그래서 최후의 수단으로 나는 Page_Load 이벤트 divControl.Style.Add("visibility", "visible");에 대해 divControl.Style.Add("visibility", "hidden");을 시도했다. 원하는 방법으로 해결되었지만 페이지 형식이 엉망이되지는 않았다.

관련 문제