无法动态更改 SelectCommand 内容

Posted

技术标签:

【中文标题】无法动态更改 SelectCommand 内容【英文标题】:Cannot change SelectCommand contents dynamically 【发布时间】:2020-04-30 11:48:27 【问题描述】:

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

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

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

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

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

为了在生成令牌后进行测试,我将查询更改为:

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

请注意,现在它应该只选择以“M”开头的汽车,例如“Mercedes”、“Maseratti”等,因此如果我输入其他不以“M”开头的内容,则不应显示任何内容。

但是,如果我在此处键入“Che”,它又是“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】:

我找到了解决方案。好吧,更像是一种变通方法,但它确实有效。

就我而言,我不需要完全更改查询,而实际上只需要更改 WHERE 子句。所以我在查询文本中添加了一个动态参数,并将其绑定到另一个控件(一个不可见的标签),强制 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

【讨论】:

隐藏表单域而不是标签可能会更好,但这是一个很好的解决方案。

以上是关于无法动态更改 SelectCommand 内容的主要内容,如果未能解决你的问题,请参考以下文章

测试 url 参数的值,然后从 c# 后面的代码中更改 SqlDataSource.SelectCommand

让 SqlDataSource 的 SelectCommand 属性值不会消失

使用代码隐藏访问 selectcommand

无法更改链接单击时的 div 内容

system.invalidoperationexception:填充:selectCommand.Connection 属性尚未初始化

MS ACCESS - 需要阅读和更新