【问题标题】:Unable to bind ComboBox SelectedValue property with object property无法将 ComboBox SelectedValue 属性与对象属性绑定
【发布时间】:2013-12-25 05:48:00
【问题描述】:

我正在尝试将组合框SelectedValue 属性与我的class property 之一绑定,这是它的代码

  ComboBox1.DataBindings.Add("SelectedValue", _bindingClass, "ID",true);
  //Also tried
  ComboBox1.DataBindings.Add("SelectedValue", _bindingClass, "ID");

类对象结构如下:

public class BindingClass
{
    public long ID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

这里是 ccomboBox 绑定的代码

   public static void BindDataSourceWithCombo(ref ComboBox cmb)
    {
        DataTable _tableSource = (new AccessConnectionManager()).GetDataTableBySQLQuery("select ValueID,ValueName from PicklistValues");

        var _dataSource = (from DataRow _row in _tableSource.Rows
                           select new
                           {
                               ValueMember = _row["ValueID"],
                               DisplayMember = _row["ValueName"].ToString()

                           }).ToList();

        cmb.DataSource = _dataSource;
        cmb.ValueMember = "ValueMember";
        cmb.DisplayMember = "DisplayMember";
    }

ComboBox 具有 ValueMemberintDisplayMemberstring

但它不起作用,只要我将组合框显示文本设置为空并且组合框上没有值显示。

编辑

当我在数据库中搜索ValueID 的DataType 时,我发现它是Int16,并且在类属性中我用Int64 分配了它。更改ID属性的dataType后问题得到解决。

【问题讨论】:

  • ComboBox 的数据源是什么?它从哪里得到它的 Items 集合?
  • 另外,ComboBox has ValueMember as int and DisplayMember as string. 没有任何意义。 ValueMember 和 DisplayMember 指的是属性的名称,而不是它们的“类型”。
  • @LarsTech 现在检查我更新了我的问题,这会让你清楚我想说什么
  • 为我工作。您的 _bindingClass 对象的值是什么?与 ComboBox 相关的任何其他事件?
  • 你的查询select ValueID,ValueName from PicklistValuesValueID的数据类型是什么?

标签: c# winforms data-binding combobox


【解决方案1】:

将您的班级更改为使用int 而不是long

public class BindingClass
{
  public int ID { get; set; }
  public string Code { get; set; }
  public string Name { get; set; }
}

您的匿名 linq 很可能将该值解释为整数,而不是长整数,并且它干扰了 DataBinding 引擎。

【讨论】:

  • 我也试过了,但这不起作用。当 selectedValue 为组合框更改时,问题未绑定。
  • @AnkushMadankar 这是我可以重现问题并解决它的唯一方法。你提到display text set to empty。您是否涉及其他数据绑定?
  • 但我还没有得到解决方案,这段代码中没有其他任何数据绑定。当我与 SelectedIndex 绑定时,它可以正常工作
  • @AnkushMadankar 用户是否通过选择下拉菜单并选择行来更改 ComboBox 的值?还是您尝试以相反的方式进行操作,在其中设置 _bindingClass.ID 值并且您希望 ComboBox 自行更新?
  • @AnkushMadankar 您是否尝试过将数据源中的 ValueID 转换为 long - ValueMember = Convert.ToInt64(_row["ValueID"]),
【解决方案2】:

这里的基本问题是组合框上的 SelectedValue 属性将是 BindingClass 类型,而您正试图将其持久化到整数字段。

我会将 SelectedValue 占位符对象从 BindingClass 类型中取出 - 无论如何尝试将值存储在此处是没有意义的。相反,将其存储在您的表单代码隐藏中,或者更好的是,如果您使用 MVVM 将其存储在您的 ViewModel 中。

Public class MyViewModel
{
    public ObservableCollection<BindingClass> { get; set; }       
    public BindingClass SelectedBindingClass {get; set; }
}

【讨论】:

  • 如何使用MyViewModel进行绑定?
【解决方案3】:
public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        BindingList<BindingClass> list = new BindingList<BindingClass>();
        list.Add(new BindingClass { ID = 1, Name = "bc1" });
        list.Add(new BindingClass { ID = 2, Name = "bc2" });
        list.Add(new BindingClass { ID = 3, Name = "bc3" });
        comboBox1.DataSource = list;

        // If you want bind to class use this code. Selected property will contain BindingClass instance, selected in combobox
        //comboBox1.DisplayMember = "Name";
        //comboBox1.DataBindings.Add("SelectedValue", this, "Selected", true, DataSourceUpdateMode.OnPropertyChanged);

        // Use label to view Selected value
        //label1.DataBindings.Add("Text", this, "Selected", true, DataSourceUpdateMode.OnPropertyChanged);

        // OR

        // If you want bind to ID use this code. SelectedId property of the form will contain ID value, selected in combobox
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "ID";
        comboBox1.DataBindings.Add("SelectedValue", this, "SelectedId", true, DataSourceUpdateMode.OnPropertyChanged);

        // Use label to view SelectedId value
        label1.DataBindings.Add("Text", this, "SelectedId", true, DataSourceUpdateMode.OnPropertyChanged);
    }

    public BindingClass Selected { get; set; }

    public int SelectedId { get; set; }
}

【讨论】:

  • 其实我已经绑定了comboBox,DisplayMember作为字符串,ValueMember作为int,所以这里我不想绑定list和comboBox。
  • 据我了解,您想将组合框的“SelectedValue”属性绑定到您类的某些属性吗?这是您尝试在问题中使用的 Binding 类的主要目标。
  • 所以,在我的例子中,这个目标实现了。我将尝试逐行解释: 1. comboBox1.DataSource = list; -- 这里我们为组合框 2 设置数据源。 comboBox1.DisplayMember = "Name" -- 这里我们设置,在组合框中为用户显示什么。你的类 BindingClass 的什么属性 3.comboBox1.ValueMember = "ID"; -- 这里我们设置,BindingClass 的哪些属性会存储在combobox 的SelectedValue 属性中。如果它为空,则将存储整个 BindingClass 实例。
  • 4. comboBox1.DataBindings.Add("SelectedValue", this, "SelectedId", true, DataSourceUpdateMode.OnPropertyChanged); -- 此行将组合框的 SelectedValue 属性与表单的 SelectedId 属性绑定,作为绑定源传递。那你需要什么?
  • 现在检查..这将使您确切了解我到底是什么。
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多