首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法动态更改SelectCommand内容

无法动态更改SelectCommand内容
EN

Stack Overflow用户
提问于 2020-01-14 02:26:20
回答 1查看 72关注 0票数 0

我在尝试动态更改SelectCommand内容时遇到问题。

有一个Telerik搜索框控件,它使用SQLDataSource不断地向数据库发送select查询,并显示根据您键入的内容过滤的单词列表。然后,如果您从列表中选择一个条目,它将成为一个“令牌”,然后您可以再次开始键入。

在我的例子中,查询应该返回汽车制造商的列表,初始查询是:

代码语言:javascript
复制
SELECT DISTINCT mfrname 
FROM Manufacturers 
WHERE mfrname IS NOT NULL 
ORDER BY mfrname

所以如果我输入"Che“,它会显示"Checker”和"Chevrolet“。因此,如果我点击“雪佛兰”,它将成为一个令牌,我的输入被重置,以便我可以再次开始输入。

出于测试目的,在生成令牌后,我稍微将查询更改为:

代码语言:javascript
复制
SELECT DISTINCT mfrname 
FROM manufacturers 
WHERE mfrname IS NOT NULL and mfrname like 'm%' 
ORDER BY mfrname

请注意,现在它应该只选择以"M“开头的汽车制造商,如"Mercedes”、"Maseratti“等,所以如果我键入其他不以"M”开头的内容,它不会显示任何内容。

但是,如果我输入"Che“,它会再次出现"Checker”和"Chevrolet“,清楚地表明它仍然使用初始查询,而不是新的查询。

OKay,我知道事件正在被触发,并且SelectCommand值正在被更改(我之所以知道这一点,是因为我添加了一个更改并显示新值的标签)。我不知道的是,为什么控件坚持使用旧的查询而不是新的查询!有什么想法吗?

我的代码前面:

代码语言:javascript
复制
<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>

下面是我的代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 03:38:48

我找到了解决方案。嗯,更像是一种变通的工作,但它是有效的。

在我的例子中,我不需要完全更改查询,实际上只需要更改WHERE子句。因此,我向查询文本添加了一个动态参数,并将其绑定到另一个控件(一个不可见的标签),强制AutoCompleteBox在运行查询之前始终查看标签的内容。

这样,更改标签的内容将更改WHERE子句中使用的参数,因此我可以控制查询。只需向SQLDataSource中添加更多参数并向页面中添加其他不可见控件,即可对其进行扩展。

所以这里是实现的解决方案,因为它可能对其他人有帮助……

代码前面:

代码语言:javascript
复制
<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>

代码隐藏:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59722137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档