Не удается изменить содержимое SelectCommand динамически - PullRequest
0 голосов
/ 13 января 2020

У меня возникла проблема с попыткой динамического изменения содержимого SelectCommand.

Имеется этот элемент управления Telerik searchbox, который использует SQLDataSource для постоянного удара по БД с помощью запроса select и отображения списка слов, отфильтрованных при вводе. , Затем, если вы выберете запись из списка, она станет «токеном», а затем вы сможете начать печатать снова.

В моем случае запрос должен вернуть список марок автомобилей, а первоначальный запрос будет выглядеть так:

SELECT DISTINCT mfrname 
FROM Manufacturers 
WHERE mfrname IS NOT NULL 
ORDER BY mfrname

Так что, если я наберу "Че", то появятся "Чекер" и "Шевроле". Поэтому, если я нажму «Chevrolet», он станет токеном, и мой набор будет сброшен, поэтому я смогу начать печатать снова.

Для целей тестирования после того, как токен сгенерирован, я пренебрегал изменением моего запроса на:

SELECT DISTINCT mfrname 
FROM manufacturers 
WHERE mfrname IS NOT NULL and mfrname like 'm%' 
ORDER BY mfrname

Обратите внимание, что теперь следует выбирать только те марки автомобилей, которые начинаются с буквы "M", например "Mercedes", "Maseratti" и т. Д. c, поэтому, если я наберу что-нибудь еще, что не начинается с буквы "M" он ничего не должен показывать.

Однако, если я наберу "Че" там, это снова "Checker" и "Chevrolet", давая понять, что он все еще использует первоначальный запрос, а не новый.

Хорошо, я знаю, что событие запускается и значение SelectCommand изменяется (я знаю это, потому что я добавил метку, которая меняет и отображает новое значение). Чего я не знаю, так это того, почему элемент управления продолжает использовать старый запрос, а не новый! Есть идеи?

Мой код:

<form id="form1" runat="server">
    <telerik:RadScriptManager runat="server" ID="RadScriptManager1" />

    <telerik:RadAutoCompleteBox RenderMode="Lightweight" runat="server" ID="RadAutoCompleteBox1" autopostback="true" EmptyMessage="Type in car make..."
        DataSourceID="SqlDataSource1" DataTextField="mfrname" InputType="Token" Width="450" DropDownWidth="150px" OnEntryAdded="RadAutoCompleteBox1_EntryAdded" >
    </telerik:RadAutoCompleteBox>

    <asp:SqlDataSource runat="server" ID="SqlDataSource1" CancelSelectOnNullParameter="false" ConnectionString="<%$ ConnectionStrings:MyConn %>" SelectCommand="SELECT DISTINCT mfrname FROM Manufacturers WHERE mfrname IS NOT NULL ORDER BY mfrname">
    </asp:SqlDataSource>

    <div>
        <br />
        <asp:label id="label1" runat="server">Waiting for update...</asp:label>
    </div>

    </form>

Мой код:

Protected Sub RadAutoCompleteBox1_EntryAdded(sender As Object, e As Telerik.Web.UI.AutoCompleteEntryEventArgs)
    SqlDataSource1.SelectCommand = "SELECT DISTINCT mfrname FROM manufacturers WHERE mfrname IS NOT NULL and mfrname like 'm%' ORDER BY mfrname"
    RadAutoCompleteBox1.DataBind()
    label1.Text = e.Entry.Text + " was added. (" + SqlDataSource1.SelectCommand + ")"
End Sub

1 Ответ

1 голос
/ 13 января 2020

Я нашел решение. Что ж, больше похоже на обходной путь, но он работает.

В моем случае мне не нужно было полностью менять запрос, а фактически только предложение WHERE. Поэтому я добавил параметр Dynami c в текст запроса и привязал его к другому элементу управления (невидимая метка), заставив AutoCompleteBox всегда просматривать содержимое метки, прежде чем выполнять запрос.

Таким образом изменение содержимого метки изменит параметр, использованный в моем предложении WHERE, и я смогу контролировать запрос. Его можно расширить, просто добавив дополнительные параметры в SQLDataSource и добавив дополнительные невидимые элементы управления на страницу.

Итак, здесь реализовано реализованное решение, поскольку оно может помочь кому-то еще ...

Код спереди:

<form id="form1" runat="server">
    <telerik:RadScriptManager runat="server" ID="RadScriptManager1" />
    <telerik:RadAutoCompleteBox RenderMode="Lightweight" runat="server" ID="RadAutoCompleteBox1" autopostback="true" EmptyMessage="Type in car make..." DataSourceID="SqlDataSource1" DataTextField="mfrname" InputType="Token" Width="450" DropDownWidth="150px" OnEntryAdded="RadAutoCompleteBox1_EntryAdded" >
    </telerik:RadAutoCompleteBox>

    <asp:SqlDataSource runat="server" ID="SqlDataSource1" CancelSelectOnNullParameter="false" ConnectionString="<%$ ConnectionStrings:MyConn %>" SelectCommand="SELECT DISTINCT mfrname FROM Manufacturers WHERE mfrname like @mypar and mfrname IS NOT NULL ORDER BY mfrname">
        <SelectParameters>
            <asp:ControlParameter ControlID="lblSQLpar" Name="mypar" PropertyName="Text" />
        </SelectParameters>
    </asp:SqlDataSource>

    <div>
        <!-- initial value -->
        <asp:label id="lblSQLpar" runat="server" Visible="false">%</asp:label>
    </div>

</form>

Код сзади:

Protected Sub RadAutoCompleteBox1_EntryAdded(sender As Object, e As Telerik.Web.UI.AutoCompleteEntryEventArgs)
    'Use CASE structure to change the parameter accordingly to your needs
    lblSQLpar.Text = "m%"
End Sub
...