Я пытаюсь отфильтровать 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>
Любые дальнейшие рекомендации будут очень оценены. благодаря
Например, вы можете создать функцию JavaScript: если у меня на моем элементе управления OnClientClick="OnClientSelectedIndexChanged"
например, я бы написал следующее:
<script type="text/javascript">
function OnClientSelectedIndexChanged(sender, args) {
__doPostBack('ddlSomeDropDownList', '');
}
</script>
Page_load
и если он правильно настроит его, он ударит событие в моем случае ddlSomeDropDownList
. Если 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");
txtID
значение поиска в текстовое поле txtID
, gridView выводит весь набор данных и не фильтрует представление grid в одну запись, как это предполагается. Мне также немного неясно, что может быть причиной такого поведения в коде метода события. Спасибо за ваш ответ.
Короткий ответ здесь заключается в том, что то, что вы хотите достичь (получение результатов, соответствующих данному фильтру), невозможно использовать только на стороне сервера.
Будучи апатридом, среда выполнения ASP.NET будет знать только те значения, которые она получает от формы при ее отправке, и значения, которые она создает при рендеринге страницы. Поэтому, не отправляя сообщения, то есть через кнопку "Фильтр", он не знает, изменился ли текст вообще. Действительно, TextChanged
событие работает только благодаря Viewstate
собственности, потенциально большим основанием 64 закодированной строки, вложенной в форме во время выполнения, чтобы держать "предыдущие" значения для элементов управления, и тому подобное.
Нажатие кнопки является действием на стороне клиента, поэтому сервер ничего не знает об этом. Точка, чтобы продемонстрировать это является то, что в то время как там Control.KeyPress событие в System.Windows.Forms
, там нет эквивалента в System.Web.UI.WebControls
.
Как уже указывалось в других ответах, Javascript будет участвовать в вашем решении, захватывая нажатие клавиши, а затем запуская запрос на сервер. Я бы рекомендовал изучить этот подход и опубликовать новые вопросы, если у вас возникнут проблемы.
Несколько моментов, которые я сделал бы о "нормальной" реализации таких функций:
Вероятно, вы не хотите создавать новый запрос к базе данных при каждом нажатии клавиши. Вы можете отфильтровать предварительно загруженный набор данных в памяти, чтобы улучшить время отклика, но это может оказаться неприемлемым, если набор данных очень велик, а страница используется часто.
Возможно, вы захотите иметь минимальное количество символов в поле "Фильтр" перед применением фильтра. Если у вас тысячи записей, фильтр всех тех, кто начинается с "a", не будет особенно полезен, не в последнюю очередь, поскольку это приведет к большой странице. Вы можете применить фильтр только в том случае, если поле легко достигло определенной длины с помощью Javascript.
Другой общей особенностью является применение фильтра через определенный период времени (т.е. 500 миллисекунд) без дальнейшего ввода. Если пользователь знает, что они хотят искать, например, "компьютер", то нет никакой фильтрации точек на каждую букву (или 6 раз, если у вас есть как минимум 3 символа, необходимые перед применением фильтра). Если вы подождаете короткое время после ввода, прежде чем применять фильтр, одновременно сбросьте таймер каждый раз, когда нажата любая клавиша, тогда у вас не будет нескольких быстрых повторных фильтров, и такие вещи могут ухудшить пользовательский интерфейс и иногда привести к неправильным результатам ( т.е. последний применяемый фильтр не является последним, который был введен).
Если вы помните только один из этих пунктов, помните об этом. Взгляните на концепцию SQL-инъекции и соответствующим образом внесите изменения в свой код. Во всем мире есть статьи, поэтому их не сложно исследовать, но они включают пользователей, вводящих вредоносные команды в поля ввода, которые затем каскадируются в базу данных, например, put '; drop table UserDe; '
'; drop table UserDe; '
'; drop table UserDe; '
в поле поиска.
TextChanged
возникает, когда текст изменяется между публикациями на сервере - ожидаете ли вы, что эта публикация будет возвращаться по мере изменения текста на стороне клиента?__doPostBack
__doPostBack__doPostBack
? Похоже, вам нужно добавить некоторыеif(IsPostBack){}
в событииPage_Load
также кFYI
вам не нужно вызыватьcon.Close();
так как он вложен вusing(){}