【问题标题】:Binding the value of an object's property to a data bound ComboBox in .NET WinForms将对象属性的值绑定到 .NET WinForms 中的数据绑定 ComboBox
【发布时间】:2020-03-31 22:31:40
【问题描述】:

目前正在使用 C# 构建一个 WinForms 数据收集工具,并且已经能够实现将我的下属对象/实体的属性的值绑定到我的表单上的控件,例如我的域模型类(例如 Person 类)上的属性的 TextBoxes、MaskedTextBoxes 和 Checkboxes。但是,我无法使用 ComboBox 控件成功完成此绑定。

我的 Person 类看起来基本上是这样的:

public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int? Gender { get; set; }
    }

我正在使用 ComboBox 的 DataSource 属性绑定到 Dictionary 并相应地设置 ValueMember 和 DisplayMember。这样做会在运行时使用我的参考数据(显示值和编码值)成功填充该 ComboBox。

Dictionary<int, string> genderValues = repository.GetGenderValues()
cboGender.DataSource = new BindingSource(genderValues, null);
cboGender.ValueMember = "Key";
cboGender.DisplayMember = "Value";

但是,当我尝试将我的 Person 对象的属性“性别”绑定到此 ComboBox 时,遵循与其他控件类型(TextBox、CheckBox 等)一起使用的模式

cboGender.DataBindings.Add(new Binding("ValueMember", _currentPerson, "Gender"));

即使在选择了 Gender ComboBox 中的项目后,我的 person 对象上的 Gender 值也始终为 NULL。也许我忽略了将 ComboBox 的 ValueMember 绑定到对象属性所需的额外步骤?

【问题讨论】:

  • 你到底想达到什么目的?
  • 为什么不使用 List&lt;Person&gt; 作为 BindingSource 的数据源(这样您就可以将它用于所有其他控件),将 DisplayMemberValueMember 设置为您想要的属性作为项目的文本和相应的值?在这里使用(未定义的)字典有什么用?

标签: c# winforms combobox


【解决方案1】:

ValueMember 是一个字符串,它不会随着组合框中的不同选择而改变。您需要使用Selected... 属性之一。因为它是一个 int,所以使用SelectedValue

【讨论】:

  • 更改为 ComboBox 创建绑定以使用 SelectedValue 的语句似乎并不能解决问题。进行更改并运行解决方案后,在 Gender ComboBox 中选择一个选项后,如果 ComboBox 失去焦点,则控件似乎会取消选择刚刚选择的选项。询问底层的“_currentPerson”对象还可以发现 Gender 属性的值仍然是 NULL。我确认没有与 Gender ComboBox 相关联的事件会干扰。
  • 还尝试使用“SelectedItem”属性 - ComboBox 在失去焦点后不会像“SelectedValue”那样取消选择选项 - 但基础对象的 Gender 仍然具有 NULL 值。
  • 那么你有两个问题。我会尝试绑定到某个类的集合而不是字典,看看它是否有所作为。
  • 创建了一个只有两个属性的 Gender 类 - DisplayValue 和 CodedValue - 创建了一个调用,该调用返回一个 IList 与存储库中的 Dictionary 相同的 KeyValue 对并分配Gender 类对应的 DisplayMember 和 ValueMember 到 Gender ComboBox。 ComboBox 在运行时使用 DisplayValues 正确填充。但是,在 ComboBox 的创建绑定语句中使用“SelectedItem”和“SelectedValue”属性重试,但没有运气 - 基础对象中的属性仍然为 NULL。
【解决方案2】:

也许这会有所帮助:

cboGender.DataBindings.Add("SelectedIndex", genderValues, "Value", false, DataSourceUpdateMode.OnPropertyChanged);

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2010-12-21
    • 2011-02-20
    • 2011-10-20
    • 2011-01-01
    • 1970-01-01
    • 2010-10-10
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多