首页 > 解决方案 > AjaxControlToolkit ComboBox 选择值手动重置在asp.net c#中不起作用

问题描述

我正在使用 AjaxControlToolkit 组合框。在页面加载时,我已将所选值设置为组合框。页面加载成功后,我手动清除了组合框选择的组合框文本框中的值。选定的值不会更改为空或 null。

现在组合框的文本框是空的,但它保留了旧的选定值。

当用户将所选值更改为空时,如何将所选值设置为空?

 <ajaxToolkit:ComboBox    ID="cmbTest" AppendDataBoundItems="false"  ClientIDMode="Static"  AutoPostBack="false"   MaxLength="64" Width="600px" runat="server" AutoCompleteMode="SuggestAppend">
            </ajaxToolkit:ComboBox>

标签: javascriptc#asp.netajaxcontroltoolkitaspx-user-control

解决方案


您永远不会得到“空”值。

但是,ajax 组合的工作方式有所不同,并且在某种意义上它有一个错误

常规下拉列表始终默认为列表中的第一个选项。

ajax 下拉列表不以第一个值开始,所选索引以 -1 开始。

(您会得到文本的空字符串和选定的值)。

事实上,很少有人注意到问题/问题,然后他们几乎总是不得不在标准组合框中添加一个空白行选项(否则默认情况下它会选择第一行)。因为那意味着用户永远不能选择空白值?

然后我们总是添加空白选项。

既然我们总是必须这样做,那么当我们说跳到使用 ajax 的时候呢?

好吧,我们习惯性地设置了空白选项默认设置。

但是,ajax 组合的行为有些不同。

它以空白选择开始(默认情况下) - 即使您没有设置。因此,选定的索引将为-1。

但是,如果用户选择了一个值,然后说稍后决定取消他们的选择?组合框 IGNORE this 并且您会看到(带有回发)组合框恢复到先前的选择。

怎么修?

只需做我们必须为常规下拉菜单做的事情 - 提供空白行选择。我真的不能说这是一个错误,但它是“一些什么”的问题。(事实上​​,我什至会说这是行为中的一个错误,并且将组合框消隐应该恢复为 selectedIndex = -1,但它不会。

但是,要解决此问题,只需简单地执行我们对常规下拉菜单所做的操作 - 为组合框提供空白选择。

这确实意味着在页面启动时,组合框将显示 -1(无选择)。现在,如果他们选择 - 好的,一切正常。但是,如果它们擦除/清空,那么您将获得“0”的索引 - 您无法通过仅擦除内容将其恢复为无值。(您可以在代码中设置 -1,但我不会担心)。

因此,典型的加载代码将如下所示:

(我没有为 ajaxtool 工具包设置 ac#,但无论如何,我建议这样做:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        LoadData
    End If
End Sub

Sub LoadData()

    Using con As New SqlConnection(My.Settings.TEST4)

        Using cmdSQL As New SqlCommand("SELECT ID, City from City ORDER BY City", con)

            con.Open()
            Dim rstData As New DataTable

            rstData.Load(cmdSQL.ExecuteReader)

            DropDownList1.DataSource = rstData
            DropDownList1.DataBind()
            DropDownList1.Items.Insert(0, New ListItem("", ""))

            ComboBox1.DataSource = rstData
            ComboBox1.DataBind()
            ComboBox1.Items.Insert(0, New ListItem("", ""))


        End Using
    End Using

End Sub

所以,在上面,我只是加载了一个常规的 asp.net 下拉列表,然后是 ajax 下拉列表。

请注意,在这两种情况下,我都在这里添加了一个空白选择。

那么,现在如果用户确实将选择删除为空白?然后它将为您选择第 0 行。

如果您没有在驱动 ajax 组合的数据中提供空白行?

那么是的,您将体验到擦除组合框被认为不是对当前选定值的更改。而且您在代码中注意到,旧的索引值仍然存在,实际上在回发之后,您会看到 ajax 组合恢复到以前的(当前)选定值。

那么,底线?

向列表中添加空白行值/选择。我们几乎总是必须使用常规下拉列表来做到这一点,所以当我们跳到 ajax 组合时,我们总是做同样的事情(这解释了为什么很少有人看到你的错误/问题)。

因此,如果您没有为 ajax 组合提供空白行选择,那么实际上您无法清除该选择。而“非常糟糕”的部分是即使您确实删除了选择(退格键或突出显示+剪切),它也会变为空白,但组合框将空白视为没有变化。

我不知道是否有可以解决上述问题的属性或设置,但如前所述,解决方案是始终在驱动组合框的数据中提供一个空白选项。

你很幸运,大多数人也是如此,因为在 99% 的情况下,我们需要一个空白的允许值。实际上,只有当您不想允许空白选择时,纸牌屋才会真正崩溃!(您不能阻止用户擦除/清空组合框,但该行为实际上并没有清空或将组合框重新设置为 -1 的选定索引(它应该这样做))。

如果您填写该组合框(它的工作方式与常规下拉菜单非常相似),那么您必须提供一个空白/空选项。换句话说,组合默认为列表中的第一项。作为一般规则,您不能擦除/清除组合框。

因此,要修复/管理此问题,然后根据示例代码在位置 0 处插入一个空白行值。我们总是不得不用一个常规的下拉列表来做这件事,所以对于 ajax 组合来说没什么大不了的,但如果你不将空白选项添加到 ajax 组合中,那肯定是大不了的,因为用户可以删除value - 并且组合框实际上不会更改其选择,除非您将该空白行作为驱动组合框的数据的一部分。

编辑:

但是,如果您希望取消选择 ajax 组合框 - 甚至没有添加额外的空白行?

你可以这样做:

ComboBox1.SelectedIndex = -1;

推荐阅读