2015-01-20 3 views
1

Я пытаюсь отфильтровать сетку с помощью текстового поля в моей таблице заголовков gridiview. В настоящее время я использую метод событий TextChanged для выполнения этой задачи, однако, когда я выполняю метод событий, я не могу отфильтровать gridiview на основе ввода поиска в 'txtID'.Как фильтровать сетку с использованием события TextChanged?

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> 

Любой дальнейший совет будет очень признателен. Благодаря

+0

Параметр 'TextChanged' событие возникает [когда текст изменяется между отправками на сервер] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox .textchanged% 28v = vs.110% 29.aspx) - вы ожидаете, что это будет опубликовано после изменения текста на стороне клиента? – barrick

+0

Вы знакомы с методом '__doPostBack' jacascript. Похоже, вам нужно добавить некоторые' if (IsPostBack) {} 'проверки в событии' Page_Load' также 'FYI', вам не нужно вызывать' con.Close(); 'поскольку он вложен внутри' using() {} ' – MethodMan

+0

@barrick, да, это моя цель. Спасибо за ваш ответ. – user3070072

ответ

1
  • Вы можете создать функцию JavaScript, например: Если у меня есть на моем контроле OnClientClick="OnClientSelectedIndexChanged", например, я бы укажите следующее:

    <script type="text/javascript"> 
        function OnClientSelectedIndexChanged(sender, args) { 
         __doPostBack('ddlSomeDropDownList', ''); 
        } 
    </script> 
    
  • Вам нужно будет сделать что-то похожее для вашего TextBox , тогда произойдет то, что он первым ударит по событию Page_load, и если он правильно настроен, он ударит событие в моем случае ddlSomeDropDownList.
+0

Спасибо, я отдам это. Большое спасибо за ваш ответ и помощь. – user3070072

+0

не проблема, дайте мне знать, если у вас возникли проблемы и проблемы – MethodMan

1

Если BindGrid(); работает на той же сетке, как grdAdjAMT_TextChanged() вам, вероятно, нужно сделать следующее:

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

На пост обратно Page_Load проходит до OnTextChanged события. Поэтому, если вы привязываете сетку к каждому сообщению, она собирается очистить текст поиска в вашей сетке. Затем, когда он проверяет TextChanged, он собирается сравнить пустую строку с пустой строкой и не произносить никаких изменений, поэтому она не будет запускать событие.

Вы также можете захотеть изменить:

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

к:

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

Первоначально я вызывал bindgrid() в инструкции postback, однако, когда я вводил значение поиска в текстовое поле 'txtID', gridview выводит весь набор данных и не фильтрует gridview на одну запись, как предполагается. Я также немного неясен, что может быть причиной такого поведения в коде метода события. Спасибо за ваш ответ. – user3070072

+1

AutoPostBack = "true" (который у вас есть) заставляет ваш пост обратно OnTextChaned, поэтому вам не нужен javascript, как предлагается в других сообщениях. Я бы изменил строку, в которой вы получаете текстовое поле, в TextBox txtName = (TextBox) GridView1.HeaderRow.FindControl ("txtID"); строка Id = txtName.Text; – referscus

+0

Спасибо за ваше предложение, я выбираю подход javascript, но я тестирую, чтобы дать ваш метод попробовать, и это тоже работает. Я хотел, я видел это раньше. спасибо за вашу помощь и время. – user3070072

1

Короткий ответ здесь заключается в том, что то, что вы хотите достичь (получение результатов, соответствующих данному фильтру), невозможно использовать только на стороне сервера.

Будучи не имеющим гражданства, среда выполнения ASP.NET будет знать только те значения, которые она получает от формы при ее отправке, и значения, которые она создает при рендеринге страницы. Поэтому, не отправляя обратно, то есть через кнопку «Фильтр», он не знает, изменился ли текст вообще. Действительно, событие TextChanged работает только из-за свойства Viewstate, потенциально большой строки с кодировкой base-64, которая встроена в форму во время выполнения, чтобы удерживать «предыдущие» значения для элементов управления и тому подобное.

Нажатие кнопки является действием на стороне клиента, поэтому сервер ничего не знает об этом. Пункт, чтобы продемонстрировать это, заключается в том, что, хотя в System.Windows.Forms есть событие Control.KeyPress, в System.Web.UI.WebControls нет эквивалента.

Как уже указывалось в других ответах, Javascript будет задействован в вашем решении, захватив нажатие клавиши, а затем запустив запрос на сервер. Я бы рекомендовал изучить этот подход и опубликовать новые вопросы, если у вас возникнут проблемы.

Пару моментов я хотел бы сделать о «нормальной» реализации такого рода функциональности:

  1. Вы, вероятно, не хотите, чтобы создать новый запрос к базе данных каждый раз, когда в нажата клавиша. Вы можете отфильтровать предварительно загруженный набор данных в памяти, чтобы улучшить время отклика, но это может оказаться неприемлемым, если набор данных очень велик, а страница используется часто.

  2. Возможно, вы захотите иметь минимальное количество символов в поле «Фильтр» перед применением фильтра. Если у вас тысячи записей, фильтр всех тех, кто начинается с «a», не будет особенно полезен, не в последнюю очередь, поскольку это приведет к большой странице. Вы можете применить фильтр только в том случае, если поле легко достигло определенной длины с помощью Javascript.

  3. Другая распространенная особенность заключается в применении фильтра через определенный период времени (то есть 500 миллисекунд) без дополнительного ввода. Если пользователь знает, что они хотят искать, например. «компьютер», то на каждую букву нет точки фильтрации (или 6 раз, если у вас есть минимум 3 символа, необходимые перед применением фильтра). Если вы подождаете короткое время после ввода, прежде чем применять фильтр, одновременно сбросьте таймер каждый раз, когда нажата любая клавиша, тогда у вас не будет нескольких быстрых повторных фильтров, и такие вещи могут ухудшить пользовательский интерфейс и иногда привести к неправильным результатам (т.е. последний применяемый фильтр не является последним, который был введен).

  4. Если вы помните только один из этих пунктов, помните об этом. Взгляните на концепцию SQL-инъекции и соответствующим образом внесите изменения в свой код. Во всем мире есть статьи, поэтому его не должно быть трудно исследовать, но это связано с тем, что пользователи вводят вредоносные команды в поля ввода, которые затем каскадируются в базу данных, например, помещая '; drop table UserDe; ' в поле поиска.

Смежные вопросы