【问题标题】:How can I populate ComboBox edit field with ValueMember but show DisplayMember in the list?如何使用 ValueMember 填充 ComboBox 编辑字段但在列表中显示 DisplayMember?
【发布时间】:2011-10-12 23:05:33
【问题描述】:

我有一个可编辑的 ComboBox,对 Text 属性进行了验证,以确保手动输入的信息有效。

编辑:我要做的就是用所选内容的ValueMember 而不是DisplayMember 填充.Text 属性

我还有.Items 填充了具有DisplayMemberValueMember 集的有效条目。

我的DisplayMember 是数据的标题,ValueMember 是数据本身。

所以Items 可能是:

(DisplayMember, ValueMember)
"Foo - 1ab2"  , "1ab2"
"Bar - 3cd4"  , "3cd4"

我对文本进行了验证,它也可以验证手动用户输入,例如“5ef6”

我遇到的问题是,如果用户从组合框中选择一个项目,它会使用 DisplayMember 属性(例如:“Foo - 1ab2”)填充文本字段,这将无法通过验证。

我尝试在三个相关的组合框事件中手动设置.Text 属性和SelectedValueSelectedItem.Value,但无济于事。

我希望 ComboBox 的 .Text 在选中时填充项目的 .ValueMember 而不是 .DisplayMember

编辑:我无法通过尝试从标题中推断值来进行验证。我将Text 发送到要验证的服务。

void FillMyCombo
{
    KeyValuePair<string, string> listValue1 = new KeyValuePair<string, string>("Foo - 1ab2"  , "1ab2")
    KeyValuePair<string, string> listValue2 = new KeyValuePair<string, string>("Bar - 3cd4"  , "3cd4")
    myCombo.Items.Add(listValue1);
    myCombo.Items.Add(listValue2);

    myCombo.DisplayMember = "Key";
    myCombo.ValueMember = "Value";
}

...

void myCombo_TextUpdated
{
    if(!myValidationService.Validate(myCombo.Text))
    {
        do error stuff
    }
}

用户可以手动输入诸如“5ef6”之类的内容,这将通过验证。 但是当他们从列表中选择一个项目而不是手动输入它时,.Text 属性会被 caption 而不是 value 填充......所以它会包含“Foo - 1ab2”并且验证失败。

编辑:回应发布的答案:我无法更改验证方法以“推断”标题中的值。我无法控制该服务。我所追求的只是显示的值

编辑:假设用户从下拉列表中选择“Foo - 1ab2”,我希望框中的文本显示“1ab2”

编辑:我也尝试在代码中设置.Text 属性,但我似乎无法使其在任何 ComboBox 事件中工作。如果有人可以回答如何在选择事件上以编程方式设置 .Text 属性(并使其提交!),他们也会回答这个问题。

【问题讨论】:

  • 您正在放置 标题 以供选择和编辑。由于似乎存在关系,您可以修复验证。
  • @HenkHolterman 我无法验证标题,我只能验证值。但是 ComboBox 使用标题而不是值填充 Text 属性。这就是我遇到的问题。
  • 您的设置不允许创建或编辑值部分。为什么要验证?
  • @HenkHolterman 这是一个可编辑的组合框。除了列表中的项目外,用户还可以手动输入自己的值。这是标准组合框行为.DropDownStyle = DropDown,因此必须验证手动输入。
  • 更好地展示一些关于 Value 和 Display 类型和绑定的代码。我迷路了。

标签: c# vb.net winforms validation combobox


【解决方案1】:

http://nickstips.wordpress.com/2010/11/19/c-datagridviewcomboboxcolumn-displaying-different-values-in-drop-down-list/ 怎么样——它们会在下拉菜单打开/关闭时即时更改 ValueMemberDisplayMember

例如DatagridViewComboBox。 ComboBox 也有这些事件,不是吗?

试一试,如果没有帮助,请投反对票 :)=

** 更新**

另一个好看的解决方案可能是ArgumentException when adding ComboBox column to DataGridView with same DataSource,看看不接受的答案。

【讨论】:

  • +1 啊哈!从略读文章这可能会奏效。当我有机会在我的应用程序中测试代码时,我会回来接受。
  • 不知道这是否是另一个好建议,但是——请参阅更新。
  • 您的链接解决了我的问题!我所做的是将.DisplayMember 设置为DropDownDropDownClosed 事件中的不同属性
  • 多么疯狂。希望这不是特定于实现的。然后它迟早会停止正常运行。
【解决方案2】:

只需验证ComboBox 实例的.SelectedText 属性。 .Text 将始终包含用户看到的内容,即显示属性的值:

void myCombo_TextUpdated
{
    if(!myValidationService.Validate(myCombo.SelectedText))
    {
        do error stuff
    }
}

SelectedText 获取或设置在ComboBox 的可编辑部分中选择的文本,我认为即使 SelectedIndex=-1/SelectedValue=Null。

【讨论】:

  • 我无法验证.SelectedValue。我不控制验证服务。此外,当用户手动输入文本时,.SelectedValue 将是 null
  • 您说您不控制验证服务,但您是否可以控制发送到服务进行验证的内容?
  • @Stuart 是的,我愿意,我可以在决定发送.Text.SelectedValue 之前检查.SelectedValue 是否为null,但这并不能解决显示内容的问题。 ...
  • 在将整个事情与 DataGridView 混淆后,我醒来 :) 并相信有一个有效的答案——请参阅我的更新答案。
  • @TheBlastOne 没有骰子,即使我可以进行验证,问题是我需要显示字段中的值,而不是标题。我编辑了问题以尝试澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多