我遇到一个问题,当数据绑定时让ComboBox按预期运行,我不确定问题出在哪里。
在下面的代码中,创建一个ComboBox并给出一个数据绑定值列表,然后将数据绑定到表单。我们的想法是ComboBox应该显示选项列表,当选择一个选项时,它应该更新数据源,并在状态文本框中显示。
所有这些似乎都能正常工作,除了ComboBox在更新值后变为空白,这是我不明白的。
当“Selection”属性的数据类型从Int32更改为string时,它的工作方式与预期完全相同。但是,作为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"));
}
}
}
答案 0 :(得分:2)
我感到挣扎并不让我感到惊讶。使用SelectedValue
绑定,它将尝试在每个Equals
(即ValueMember
)和绑定属性({{}之间找到匹配项(意味着CodeOrLabel
) 1}})。但是从不是真的(例如)Selection
,所以这永远不会匹配。因此,可能会判断不是所选项目(因为没有匹配)。
基本上,请在此处使用"123".Equals(123)
,或在整个过程中使用string
。