【问题标题】:How to go back to previously selected entry in a combobox?如何返回组合框中先前选择的条目?
【发布时间】:2021-10-11 20:45:28
【问题描述】:

在我的应用程序中有这样的要求:

在一个表单中有一个组合框和 4 个文本框。组合框始终包含 1...10 的值范围。根据组合框中选择的值,我需要从数据库中读取与所选值对应的 4 个数据项,并将这些值显示在 4 个文本框中。因此,对于组合框中的每个值,数据库中有 4 个值。

此外,用户可以通过编辑 4 个文本框中的值来更改这些值。

例如假设组合框中当前选择的值为1。因此从数据库中读取记录1对应的数据并显示在4个文本框中。如果用户没有编辑文本框中的任何值并选择条目 2(或除 1 之外的任何其他值),则从数据库中获取与新选择的值(即 2)对应的数据并显示在 4 个文本框中。但是,如果用户通过在四个可用文本框中的任何一个中键入来编辑任何值,则对应于记录 1 的那些新值应保存到数据库中,然后再切换到新选择的条目,即 2。

为此,我在组合框的“SelectedIndexChanged 事件处理程序”中编写了一些代码。在那里我检查用户是否更改了任何值。如果是,我会提示用户保存数据。保存数据后,组合框会显示用户新选择的值,即 2(4 个文本框会显示记录 2 对应的数据)。 上述所有功能都可以正常工作。但是还有一个附加要求“如果对数据库的保存操作失败,则组合框中的初始值应与用户编辑的数据(在文本框中)一起显示,这意味着如果数据库写入失败,我必须显示当前选择的值 1 没有切换到新选择的值 2"。

在 SelectedIndexChanged 处理程序中,我尝试编写以下代码。

If (DatabaseWriteFails)
{
    ComboBox->SelectedIndex = previous_value; (previous_value is 1 in our example)
}

但是上面的代码不起作用(我想是因为我们试图从 SelectedIndexChanged 处理程序本身更改选定的值)。当我们进入 SelectedIndexChanged 处理程序时,我可以看到 ComboBox->SelectedValue 已更改为新选择的值,即 2。

问题是“一旦我们进入 SelectedIndexChanged 处理程序,我们如何才能回到上一个条目”?任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 我觉得你让生活变得很辛苦;从问题的描述来看,使用数据绑定很容易
  • @CaiusJard 此外,这是一个奇怪的逻辑。 “如果我不能保存,我就扔掉我的更改”。当您始终可以选择前一个值并再次加载前 4 个值时
  • @CaiusJard:谢谢你的建议。我以前没有使用过数据绑定。我对 C# 真的很陌生。我会检查这个。希望能帮助解决问题
  • @T.S. : 可能是我描述的问题不够好。我不会扔掉我的改变。如果出现错误,我将再次显示未保存的条目并为用户提供重试选项。

标签: c# combobox


【解决方案1】:

首先,如果您从事件中更改 ComboBox 值,它将再次触发该事件,因此不要使用 SelectedIndexChanged,而是使用 SelectionChangeCommitted,它仅在用户从 UI 更改所选项目时发生,而不是通过编程方式。

其次,根据我的经验,您应该使用 SelectedItem 或 SelectedIndex 更改下拉列表,SelectedValue 绑定不会更新 ComboBox。

如 cmets 中所述,我对您的建议是使用绑定甚至 ReactiveUI

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多