组合框在数据绑定更新后变为空白,即使数据更新成功

问题描述:

我遇到了使数据绑定时按预期操作ComboBox的问题,但我不确定问题出在哪里。组合框在数据绑定更新后变为空白,即使数据更新成功

在下面的代码中,创建一个ComboBox并给出一个数据绑定值列表,然后将数据绑定到该表单。这个想法是,ComboBox应该显示选项列表,当选择一个选项时,它应该更新数据源,并在状态文本框中指示。

所有这些似乎工作正常,除了组合框更新后,这是我不明白的值变空白。

当“选择”属性的数据类型从Int32更改为字符串时,它的工作原理与预期完全相同。但是,作为Int32,即使它正确设置值,该框仍然为空。

任何帮助了解如何解决这个问题,将不胜感激。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace ComboboxDatabindingTest 
{ 
    public partial class Form1 : Form 
    { 
     ComboBox _box; 
     TextBox _status; 
     ValuesDataSource _bsValues; 
     BindingSource _bsObject; 
     Binding _binding; 
     int _selection; 

     public Form1() 
     { 
      _selection = 0; 

      _bsValues = new ValuesDataSource(); 

      _bsObject = new BindingSource(); 
      _bsObject.DataSource = this; 

      _status = new TextBox(); 
      _status.Left = 20; 
      _status.Top = 50; 
      _status.Width = 200; 
      _status.ReadOnly = true; 

      _box = new ComboBox(); 
      _box.Name = "box"; 
      _box.Left = 20; 
      _box.Top = 20; 
      _box.Width = 200; 
      _box.DropDownStyle = ComboBoxStyle.DropDownList; 
      _box.ValueMember = "CodeOrLabel"; 
      _box.DisplayMember = "Label"; 
      _box.DataSource = _bsValues; 
      _binding = _box.DataBindings.Add("SelectedValue", _bsObject, "Selection"); 

      this.Controls.Add(_box); 
      this.Controls.Add(_status); 
     } 

     public int Selection 
     { 
      get { return _selection; } 
      set { _selection = value; _status.Text = value.ToString(); } 
     } 
    } 

    public class Value 
    { 
     private string _code = null; 
     private string _label = ""; 

     public Value(string code, string label) 
     { 
      _code = code; 
      _label = label; 
     } 

     public string Code 
     { 
      get { return _code; } 
     } 

     public string Label 
     { 
      get { return _label; } 
     } 

     public string CodeOrLabel 
     { 
      get { return _code == null ? _label : _code; } 
     } 
    } 

    public class ValuesDataSource : BindingList<Value> 
    { 
     public ValuesDataSource() 
     { 
      base.Add(new Value("1", "California")); 
      base.Add(new Value("2", "Nevada")); 
      base.Add(new Value("3", "Arizona")); 
      base.Add(new Value("4", "Oregon")); 
     } 
    } 
} 

它并不令人惊讶,它正在挣扎。用SelectedValue进行绑定,它将尝试找到每个(即CodeOrLabel)的ValueMember与绑定属性(Selection)之间的匹配(意思是Equals)。但它是从来没有是真的(例如)"123".Equals(123),所以这永远不会匹配。所以这大概是决定不是一个选定的项目(因为没有匹配)。

基本上,在这里使用一个string,或在整个使用int

+0

谢谢!我知道这肯定是一个类型问题,但我找不到它。通过将CodeOrLabel作为CodeInt32的别名并将其用作ValueMember来解决。这允许我即使在绑定到不同数据类型的属性时也使用相同的Value对象。 – Jeremy 2010-01-10 15:40:44