无法动态更改 SelectCommand 内容
Cannot change SelectCommand contents dynamically
我在尝试动态更改 SelectCommand 内容时遇到问题。
有一个 Telerik 搜索框控件,它使用 SQLDataSource 不断地用 select 查询查询数据库,并显示根据您的输入过滤的单词列表。然后,如果您从列表中选择一个条目,它将变成 "token",然后您可以再次开始输入。
在我的例子中,查询应该 return 一个汽车品牌列表,初始查询是:
SELECT DISTINCT mfrname
FROM Manufacturers
WHERE mfrname IS NOT NULL
ORDER BY mfrname
因此,如果我键入 "Che",它将显示 "Checker" 和 "Chevrolet"。因此,如果我单击 "Chevrolet",它将成为一个标记,我的输入将被重置,以便我可以再次开始输入。
为了在生成令牌后进行测试,我稍微将查询更改为:
SELECT DISTINCT mfrname
FROM manufacturers
WHERE mfrname IS NOT NULL and mfrname like 'm%'
ORDER BY mfrname
请注意,现在它应该只 select 汽车以 "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
我找到了解决办法。好吧,更像是一种解决方法,但它确实有效。
在我的例子中,我不需要完全更改查询,实际上只需要更改 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 内容时遇到问题。
有一个 Telerik 搜索框控件,它使用 SQLDataSource 不断地用 select 查询查询数据库,并显示根据您的输入过滤的单词列表。然后,如果您从列表中选择一个条目,它将变成 "token",然后您可以再次开始输入。
在我的例子中,查询应该 return 一个汽车品牌列表,初始查询是:
SELECT DISTINCT mfrname
FROM Manufacturers
WHERE mfrname IS NOT NULL
ORDER BY mfrname
因此,如果我键入 "Che",它将显示 "Checker" 和 "Chevrolet"。因此,如果我单击 "Chevrolet",它将成为一个标记,我的输入将被重置,以便我可以再次开始输入。
为了在生成令牌后进行测试,我稍微将查询更改为:
SELECT DISTINCT mfrname
FROM manufacturers
WHERE mfrname IS NOT NULL and mfrname like 'm%'
ORDER BY mfrname
请注意,现在它应该只 select 汽车以 "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
我找到了解决办法。好吧,更像是一种解决方法,但它确实有效。
在我的例子中,我不需要完全更改查询,实际上只需要更改 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