powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Изменение where в LINQ
22 сообщений из 22, страница 1 из 1
Изменение where в LINQ
    #38195243
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
Хочу изменить построенную визардом реализацию, чтобы при изменении значения текстбокса производился отбор записей аналогично
Код: sql
1.
SELECT * FROM tClient WHERE Name1 Like @Name + '%'



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="DataClassesDataContext" 
        Select="new (Name1, Name2, Name3, BirthDay, DocSerial, DocNumber)" 
        TableName="tClients" OrderBy="Name1, Name2, Name3" 
        AutoGenerateWhereClause="True" 
        <WhereParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="Name1" PropertyName="Text" Type="String" />
       </WhereParameters>
</asp:LinqDataSource>



Убрал WherePartameters и AutoGenerateWhereClause и попробовал перехватывать событие текстбокса TextChaged и прописывать что-то типа
Код: c#
1.
        LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";



Это нормальный подход?
Как в WhereParameters засунуть?
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38195295
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Where="Name1.StartsWith(@Name)"
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197101
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
Продолжаем разговор...
Сейчас для серверного TextBox в событии TextChanged изменяется значение LinqDataSource.Where.
В UpdatePanel лежит ListView, привязанный к LinqDataSource.
TextBox лежит не в UpdatePanel, но для панели прописан триггер на TextBox.

Хочу, чтобы данные обновлялись (выполнялся запрос) не только по триггеру или по серверному TextChanged, а по onkeyup на клиенте.
Как из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола?

Сделал по подобию примера из http://msdn.microsoft.com/ru-ru/library/ms178210(v=vs.90).aspx
В итоге я вижу, что при вводе в текстовое поле производится вызов серверного метода (отображается предупреждение), а вот обновление данных в UpdatePanel/ListView не происходит. Что сделал не так? Есть ли еще какие-либо более лаконичные или правильные способы?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
  <script type="text/ecmascript">
    function LookUp()
    {
        CallServer(document.getElementById("TextBox1").value, "");
    }
    function ReceiveServerData(rValue)
    {   
        document.getElementById("WarnSpan").innerHTML = rValue;

    }
  </script>
...
                <asp:TextBox ID="TextBox1" runat="server" Width="210px" onkeyup="LookUp();" ></asp:TextBox>
                <span id="WarnSpan"></span> 
...



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler 
{
    protected System.Collections.Specialized.ListDictionary catalog;
    protected String returnValue;

    protected void Page_Load(object sender, EventArgs e)
    {
        String cbReference =  Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
        String callbackScript;

        callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + ";}";
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(),  "CallServer", callbackScript, true);
    }
    public void RaiseCallbackEvent(String eventArgument)
    {
        if (eventArgument.Length > 4)
        {
            LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + eventArgument + "\")";
            UpdatePanel1.Update();
            returnValue = "";
        }
        else
        {
            returnValue = "Длина строки поиска должна быть больше 4 символов.";
        }
    }
    public String GetCallbackResult()
    {
        return returnValue;
    }
    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";
    }
}
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197124
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemКак из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола? http://api.jquery.com/jQuery.post/
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197140
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rem,

.. а для ListView не надо DataBind() вызывать при апдейте?
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197154
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
carrotikRem,

.. а для ListView не надо DataBind() вызывать при апдейте?

А надо?
В исходном варианте с TextChanged и без DataBind() работало.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197157
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
ПаганельRemКак из клиентского скрипта вызвать серверный метод, передав в качестве параметра текущее значение контрола? http://api.jquery.com/jQuery.post/

Это более кошерный вариант? Или просто один из вариантов?
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197170
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rem,

...я не уверен, поскольку с LinqDataSource не имел дело .. С обычным дейтасорсом - это обычное дело ...
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197177
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemПаганельпропущено...
http://api.jquery.com/jQuery.post/

Это более кошерный вариант? Или просто один из вариантов?просто один из
Вы ж спрашивали "есть ли еще способы" :)


по сабжу - поставьте точку останова внутри ReceiveServerData и гляньте что туда пришло
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197221
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
ПаганельRemпропущено...


Это более кошерный вариант? Или просто один из вариантов?просто один из
Вы ж спрашивали "есть ли еще способы" :)


по сабжу - поставьте точку останова внутри ReceiveServerData и гляньте что туда пришло

Всё как надо входит и выходит. Только вот данные в ListView не обновляются.
При этом та же самая манипуляция с LinqDataSource в TextChanged приводит к желаемому результату.
Да, попробовал и DataBind() прописать - не помогло.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197228
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemВсё как надо входит и выходит. Только вот данные в ListView не обновляютсяза обновление отвечает эта строчка?Rem
Код: javascript
1.
document.getElementById("WarnSpan").innerHTML = rValue;

тогда попробуйте локализировать проблему
например, проверьте, находится ли элемент по его id
или попробуйте поменять rValue на какое-нибудь простое значение типа <b>test</b> и посмотреть что получится...
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197288
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
ПаганельRemВсё как надо входит и выходит. Только вот данные в ListView не обновляютсяза обновление отвечает эта строчка?Rem
Код: javascript
1.
document.getElementById("WarnSpan").innerHTML = rValue;

тогда попробуйте локализировать проблему
например, проверьте, находится ли элемент по его id
или попробуйте поменять rValue на какое-нибудь простое значение типа <b>test</b> и посмотреть что получится...

Нет, эта строчка просто информационно-отдладочная.
DataSource для ListView является LinqDataSource. В серверном методе прописано изменение Where для моего LinqDataSource.
При использовании серверного вызова TextChanged выполняется просто
LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + TextBox1.Text + "\")";

Примерно то же самое делается в методе RaiseCallbackEvent, который дергается клиентом:
LinqDataSource1.Where = "Name1.StartsWith(" + "\"" + eventArgument + "\")";

Первый вариант работает. При этом не надо передергивать ни сам LinqDataSource, ни ListView, ни UpdatePanel. UpdatePanel и так "понимает", что в дочернем элементе произошли изменения.
Во втором случае надо получить новый набор данных и как-то сказать серверу, чтобы он обновил для клиента ListView. Это я и пытаюсь делать путем вызова UpdatePanel1.Update()

Похоже, что-то совсем простое я делаю не так...
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197293
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) RemПаганельза обновление отвечает эта строчка?Нет, эта строчка просто информационно-отдладочнаяа где же клиентский код, который должен обновлять чаcть страницы?

2) покажите пример, что Вам приходит внутри rValue
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197296
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
И еще.
И в случае с первым вариантом ListView или LinqDataSource работает как-то криво. Т.е. после изменения Where в TextChanged ListView отображает вполне корректные данные, но при попытке навигации по ListView я возвращаюсь к исходному набору данных.
Т.е. получили 1000 ивановых, отобразились первые, скажем, 20 и n страниц. Тыкаю в любую страницу и получаю не ивановых, а полный список как будто никакого условия нет.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197305
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
Паганель1) Remпропущено...
Нет, эта строчка просто информационно-отдладочнаяа где же клиентский код, который должен обновлять чаcть страницы?

2) покажите пример, что Вам приходит внутри rValue

Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надо.
UpdatePanel просто должна знать, что ей надо обновиться. Либо от дочернего контрола, либо по триггеру, либо вызвав обновление программно.

Внутри rValue приходит строка, которая благополучно отображается в spane-е.

Вариант с развесистым клиентским и серверным кодом я уже попробовал - с ним проблем никаких. Теперь хочу то же самое сделать с использованием ajax-компонентов asp.net
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197317
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RemПаганельа где же клиентский код, который должен обновлять чаcть страницы?Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надоесли код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197442
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
ПаганельRemпропущено...
Как я понимаю, за это отвечает UpdatePanel и ScriptManager и для это ничего дополнительно кодить на клиенте не надоесли код пишете не Вы, то это еще не значит, что код не существует
найдите его firebug-ом например

Я это понимаю. Просто в контексте Вашего вопроса речь шла о результате, который принял клиентский скрипт, написанный мной. А он как раз, кроме вызова серверного метода ничего и не делает.

Посмотрел... сервер отдал в клиентский html несколько hidden-полей, в одном из которых, видимо, данные + еще javascript-ы с кучей кода, которые, как я понимаю, занимаются отрисовкой результата.
Как посмотреть, что конкретно содержится в hidden-поле я не знаю.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197549
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
берем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197656
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
Паганельберем firebug
ищем dopostback
ставим точку останова
смотрим - с какими параметрами она вызывается при обновлении updatepanel
пишем свой код, вызывающий ее с теми же параметрами
вешаем этот код в качестве обработчика на изменение текста

dopostback в клиентском сценарии вовсе не вызывается на событии изменения текста
Ладно, спасибо, покапаюсь в примере на msdn.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197666
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Remdopostback в клиентском сценарии вовсе не вызывается на событии изменения текстану да, говорю же руками доделайте

а на других событиях?
попробуйте кнопку внутрь панели вставить и посмотреть как dopostback тогда вызывается
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38197713
Rem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Rem
Гость
ПаганельRemdopostback в клиентском сценарии вовсе не вызывается на событии изменения текстану да, говорю же руками доделайте

а на других событиях?
попробуйте кнопку внутрь панели вставить и посмотреть как dopostback тогда вызывается

По всей видимости, проблема связана с тем, что на одной странице одновременно обратный вызов реализуется, как программно (на ввод в TextBox) так и декларативно в виде компонентов ScriptManager и UpdatePanel, которые сами разруливают внешний вид контролов в зависимости от событий.
Собственно говоря, я ведь от сервера и для первого случая получаю ответ, а тут задача состоит в том, чтобы еще пнуть UpadePanel со своим умом и в "параллельной реальности" :-).
Или слать post принудительно в клиентском сценарии после ввода символа в TextBox.
...
Рейтинг: 0 / 0
Изменение where в LINQ
    #38198108
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думал я думал что ответить
так и не придумал

а давайте так
когда Вы последуете моим рекомендациям - отпишитесь о результате, ок?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Изменение where в LINQ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]