组合框在数据绑定更新后变为空白,即使数据更新成功
问题描述:
我遇到了使数据绑定时按预期操作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
。
谢谢!我知道这肯定是一个类型问题,但我找不到它。通过将CodeOrLabel作为CodeInt32的别名并将其用作ValueMember来解决。这允许我即使在绑定到不同数据类型的属性时也使用相同的Value对象。 – Jeremy 2010-01-10 15:40:44