2015-01-20 3 views
1

내 gridview 내 headerTemplate 내에서 textbox를 사용하여 gridview를 필터링하려고합니다. 현재 TextChanged 이벤트 메서드를 사용하여이 작업을 실행하지만 이벤트 메서드를 실행할 때 'txtID'의 검색 입력을 기반으로 gridiview를 필터링 할 수 없습니다. TextChanged 이벤트를 사용하여 gridview를 필터링하는 방법은 무엇입니까?

protected void grdAdjAMT_TextChanged(object sender, EventArgs e) 
    { 
     TextBox txtName = (TextBox)GridView1.Rows[(0)].FindControl("txtID"); 

     string strConnString = ConfigurationManager.ConnectionStrings["####"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(strConnString)) 
     { 
      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.CommandText = "select u.[uID], u.[uForenames], 
        u.[uSurname], u.[uCompany], u.[uEmailAddress], 
        s.[sStartDate] 
       from [dbo].[UserDe] 
       where u.[uID] like '%" + txtName + "%' 
       order by s.[sStartDate] desc"; 

       cmd.Connection = con; 
       con.Open(); 
       GridView1.DataSource = cmd.ExecuteReader(); 
       GridView1.DataBind(); 
       con.Close(); 
      } 
     } 
    } 

protected void Page_Load(object sender, EventArgs e) 
    { 
     BindGrid(); 

    } 

나는 나의 스크립트를 디버깅 디버거 만 pageload 및 BindGrid 방법을 통해가는 것을 발견,하지만 "grdAdjAMT_TextChanged"방법을 통과하지 않습니다. 나는 또한 textChange 메서드를 별도로 디버깅하려고 시도했지만 여전히 아무 일도 일어나지 않습니다.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="uID" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White" CellPadding="4" ForeColor="#333333" GridLines="None" > 
     <AlternatingRowStyle BackColor="White" /> 
    <Columns> 

     <asp:TemplateField HeaderText="ID" SortExpression="ID"> 
     <HeaderTemplate> 
     <asp:Label ID="Label1" runat="server" Text="ID"></asp:Label><br /> 
      <asp:TextBox ID="txtID" runat="server" OnTextChanged="grdAdjAMT_TextChanged" AutoPostBack="true"></asp:TextBox> 
     </HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label2" runat="server" Text='<%# Bind("uID") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

추가 조언이 있으면 대단히 감사하겠습니다.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    {   
     BindGrid(); 
    } 
} 

을 다시 Page_Load 실행 OnTextChanged 이벤트 이전 게시물에 : 당신은 아마 할 필요가 grdAdjAMT_TextChanged()으로 감사

+0

'TextChanged' 이벤트는 [서버에 대한 게시물간에 텍스트가 바뀔 때] 발생합니다. (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox .textchanged % 28v = vs.110 % 29.aspx) - 클라이언트 측에서 텍스트가 변경 될 때이를 다시 게시 할 것으로 예상하십니까? – barrick

+0

당신은'__doPostBack' 자바 스크립트 메소드에 익숙합니다. 이것은'Page_Load' 이벤트에서'if (IsPostBack) {}'체크를 추가해야 할 필요가있는 것처럼 들리지만'FYI'에서는'con.Close();를 호출 할 필요가 없습니다. ''() {}'안에 중첩되어 있기 때문에 – MethodMan

+0

@ barrick 예, 그것이 내 목표입니다. 당신의 답변에 감사드립니다. – user3070072

답변

1
  • 당신은 예를 들어, 자바 스크립트 기능을 만들 수 있습니다 내가 예를 들어 내 컨트롤 OnClientClick="OnClientSelectedIndexChanged"에있는 경우 나는 것 다음을 적어주십시오 :

    <script type="text/javascript"> 
        function OnClientSelectedIndexChanged(sender, args) { 
         __doPostBack('ddlSomeDropDownList', ''); 
        } 
    </script> 
    
  • 당신은 TextBox 에 대해 비슷한 작업을 수행해야합니다. 그러면 처음에는 Page_load 이벤트가 발생하고 올바르게 설정 되었다면 내 경우에는 ddlSomeDropDownList의 이벤트가 발생합니다.
+0

감사합니다. 나는이 일을 줄 것입니다. 귀하의 회신과 도움에 많은 감사드립니다. – user3070072

+0

문제가 있거나 문제가있는 경우 알려주세요. – MethodMan

1

BindGrid(); 경우 동일한 그리드에 노력하고 있습니다. 그리드의 검색 텍스트를 지우는 모든 게시물에 그리드를 바인딩하는 경우. 그런 다음 TextChanged를 검사하여 빈 문자열을 빈 문자열과 비교하고 변경 사항을 말하지 않으므로 이벤트를 실행하지 않습니다.

TextBox txtName = (TextBox)GridView1.Rows[(0)].FindControl("txtID"); 

에 :

또한 변경할 수 있습니다

TextBox txtName = (TextBox)GridView1.HeaderRow.FindControl("txtID"); 
+0

원래는 포스트 백 문에서 bindgrid()를 호출했지만,'txtID' 텍스트 상자에 검색 값을 입력하면 gridview는 전체 데이터 집합을 출력하고 그리드 뷰를 하나의 레코드로 필터링하지 않습니다. 나는 또한 약간 불분명하다. 어쩌면 이벤트 메쏘드 코드에서 이런 행동이 일어날 수도있다. 당신의 답변에 감사드립니다. – user3070072

+1

AutoPostBack = "true"(가지고있는) 게시물을 OnTextChaned로 되돌려 주므로 다른 게시물에서 제안한대로 자바 스크립트가 필요하지 않습니다. 텍스트 상자를 TextBox로 변경하는 줄을 변경합니다. txtName = (TextBox) GridView1.HeaderRow.FindControl ("txtID"); 문자열 ID = txtName.Text; – referscus

+0

제안 해 주셔서 감사합니다. 자바 스크립트 접근 방식을 선택합니다. 그러나 메소드에 시도해보기 위해 테스트하고 작동합니다. 나는 그것을 더 빨리 보았 으면 좋겠다. 도와 주셔서 감사합니다. – user3070072

1

여기서 짧은 대답은 서버 측 코드 만 사용하여 달성하려는 것 (주어진 필터와 일치하는 결과 검색)이 불가능하다는 것입니다.

상태가 없기 때문에 ASP.NET 런타임은 양식을 게시 할 때받은 값과 페이지를 렌더링 할 때 만들어지는 값만 인식합니다. 따라서 '필터'버튼을 통해 다시 게시하지 않아도 텍스트가 전혀 변경되지 않았는지 전혀 알 수 없습니다. 사실 TextChanged 이벤트는 Viewstate 속성, 런타임에 의해 컨트롤에 '이전'값을 저장하기 위해 폼에 포함되는 잠재적으로 커다란 base-64로 인코딩 된 문자열로 인해 작동합니다.

버튼을 누르는 것은 클라이언트 측 작업이므로 서버는 아무 것도 모릅니다. 이것을 입증하는 요점은 이벤트가 System.Windows.Forms에있는 반면 System.Web.UI.WebControls에는 해당 사항이 없음을 나타냅니다.

이미 다른 답변에 나와 있듯이 Javascript가 솔루션에 포함되어 키 누르기를 캡처 한 다음 서버에 요청을 시작합니다. 그 접근법을 연구하고 거기에 문제가 생기면 새로운 질문을 게시하는 것이 좋습니다.

나는 기능의 이런 종류의 '정상'구현에 대해 것 포인트의 몇 :

  1. 당신은 아마 데이터베이스마다 A와 새로운 요청을 생성하지 않으 키를 누릅니다. 응답 시간을 향상시키기 위해 메모리에 사전로드 된 데이터 세트를 필터링 할 수 있지만 데이터 세트가 매우 크고 페이지를 자주 사용하는 경우에는 적합하지 않을 수 있습니다.

  2. 필터를 적용하기 전에 필터 입력란에 최소 문자 수를 입력 할 수 있습니다. 수천 개의 레코드가있는 경우 'a'로 시작하는 모든 필터가 큰 페이지를 생성 할 때 특히 유용하지는 않습니다. Javascript로 필드가 일정한 길이에 쉽게 도달했을 때만 필터를 적용 할 수 있습니다. 또 다른 공통적 인 특징은 추가 입력없이 특정 기간 (즉, 500 밀리 초) 후에 필터를 적용하는 것이다. 사용자가 검색하고자하는 것을 알고있는 경우. '컴퓨터'를 선택하면 각 문자에 점 필터링이 적용되지 않습니다 (또는 필터를 적용하기 전에 최소 3자를 필요로하는 경우 6 번). 아무런 키를 누를 때마다 타이머를 재설정하는 동안 필터를 적용하기 전에 입력 한 후 잠시 기다리면 몇 가지 빠른 다시 채우기가 수행되지 않으므로 사용자 경험이 저하되고 때로는 잘못된 결과가 발생할 수 있습니다 (즉, 마지막으로 적용된 필터는 마지막으로 입력 된 필터가 아닙니다.

  3. 이 중 하나만 기억하면이 점을 기억하십시오. SQL 삽입 개념을 잘 살펴보고 적절하게 코드를 수정하십시오. 어디에서나 기사가 있으므로 탐험하기가 어렵지 않지만 입력 필드에 악의적 인 명령을 입력하면 데이터베이스에 계단식으로 연결됩니다 (예 : '; drop table UserDe; ').

관련 문제