Как отфильтровать gridview с помощью события TextChanged?

1

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

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 возникает, когда текст изменяется между публикациями на сервере - ожидаете ли вы, что эта публикация будет возвращаться по мере изменения текста на стороне клиента?
  • 0
    знакомы ли вы с __doPostBack __doPostBack __doPostBack ? Похоже, вам нужно добавить некоторые if(IsPostBack){} в событии Page_Load также к FYI вам не нужно вызывать con.Close(); так как он вложен в using(){}
Показать ещё 3 комментария
Теги:
gridview

3 ответа

1
Лучший ответ
  • Например, вы можете создать функцию JavaScript: если у меня на моем элементе управления OnClientClick="OnClientSelectedIndexChanged" например, я бы написал следующее:

    <script type="text/javascript">
        function OnClientSelectedIndexChanged(sender, args) {
            __doPostBack('ddlSomeDropDownList', '');
        }
    </script>
    
  • Вам нужно будет сделать что-то подобное для вашего TextBox, тогда произойдет то, что он впервые попадет в событие Page_load и если он правильно настроит его, он ударит событие в моем случае ddlSomeDropDownList.
  • 0
    Спасибо, я дам это идти. Большое спасибо за ваш ответ и помощь.
  • 0
    не проблема, дайте мне знать, если у вас есть какие-либо проблемы и / или проблемы
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 () в выражении обратной передачи, однако, когда я txtID значение поиска в текстовое поле txtID , gridView выводит весь набор данных и не фильтрует представление grid в одну запись, как это предполагается. Мне также немного неясно, что может быть причиной такого поведения в коде метода события. Спасибо за ваш ответ.
  • 1
    AutoPostBack = "true" (который у вас есть) приводит к тому, что ваше сообщение возвращается на OnTextChaned, поэтому вам не нужен javascript, как предлагается в других сообщениях. Я бы изменил строку, в которой вы получаете текстовое поле, на TextBox txtName = (TextBox) GridView1.HeaderRow.FindControl ("txtID"); string Id = txtName.Text;
Показать ещё 1 комментарий
1

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

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

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

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

Несколько моментов, которые я сделал бы о "нормальной" реализации таких функций:

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню