实践发现:以SelectedIndex赋值让ComboBox自动选中时能获得SelectedValue;以SelectedText赋值让ComboBox自动选中时获得SelectedValue为空。
即
this.comboBox1.SelectedIndex = this.comboBox1.FindString(room);
这样能获得comboBox1.SelectedValue值。
this.comboBox1.SelectedText = room;
这样获得comboBox1.SelectedValue值为空。
下面为转帖内容:
最近在项目中处理一个winForm中设定ComboBox值,奇怪的是用一个对象匹配ComboBox的Datasource集合的一个对象时,设置SelectedValue时,竟然得到SelectedValue为null。
网上搜索一下,有说是如果用DateSet绑定时,SelectedValue得到的是null或DataRowView。
后来反复实践,发现可以用以下方法实现:
private void SetValueByItem()
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "第8名";
cbList.SelectedItem = ac.FindAll(delegate(Area ar) { return ar.Area_ID == a.Area_ID; })[0];
lbResult.Text = cbList.SelectedItem.GetType().ToString() + ":" + cbList.SelectedValue.ToString();
}
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "第8名";
cbList.SelectedItem = ac.FindAll(delegate(Area ar) { return ar.Area_ID == a.Area_ID; })[0];
lbResult.Text = cbList.SelectedItem.GetType().ToString() + ":" + cbList.SelectedValue.ToString();
}
其他两种设置方式:
private void SetValueByValue()
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "第8名";
cbList.SelectedValue = a.Area_ID;
lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":" + cbList.SelectedValue.ToString();
}
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "第8名";
cbList.SelectedValue = a.Area_ID;
lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":" + cbList.SelectedValue.ToString();
}
完整代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WinFormCombobox { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } #region Members AreaLists ac; public AreaLists GetTestArea() { AreaLists al = new AreaLists(); for (int i = 1; i < 11; i++) { Area a = new Area(); a.Area_ID = i.ToString(); a.Area_Name = "第" + i.ToString() + "名"; al.Add(a); } return al; } #endregion #region Events private void frmMain_Load(object sender, EventArgs e) { ac = GetTestArea(); cbList.DataSource = ac; cbList.DisplayMember = "Area_Name"; cbList.ValueMember = "Area_ID"; } private void btnSetCombobox_Click(object sender, EventArgs e) { ////SetValue0(); //SetValueByValue(); ////SetValueByItem(); SetValueByText(); } #endregion #region Methods private void SetValue0() { Area a = new Area(); a.Area_ID = "8"; a.Area_Name = "第8名"; cbList.DataSource = GetTestArea(); cbList.DisplayMember = "Area_Name"; cbList.ValueMember = "Area_ID"; cbList.SelectedValue = a.Area_ID; lbResult.Text = cbList.SelectedValue.ToString(); } private void SetValueByValue() { Area a = new Area(); a.Area_ID = "8"; a.Area_Name = "第8名"; cbList.SelectedValue = a.Area_ID; lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":" + cbList.SelectedValue.ToString(); } private void SetValueByItem() { Area a = new Area(); a.Area_ID = "8"; a.Area_Name = "第8名"; cbList.SelectedItem = ac.FindAll(delegate(Area ar) { return ar.Area_ID == a.Area_ID; })[0]; lbResult.Text = cbList.SelectedItem.GetType().ToString() + ":" + cbList.SelectedValue.ToString(); } private void SetValueByText() { Area a = new Area(); a.Area_ID = "8"; a.Area_Name = "第8名"; cbList.SelectedIndex = cbList.FindString(a.Area_Name); lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":" + cbList.SelectedValue.ToString(); } #endregion } } using System; using System.Collections.Generic; using System.Text; namespace WinFormCombobox { #region Area public class Area { private string m_Area_ID; public string Area_ID { get { return m_Area_ID; } set { m_Area_ID = value; } } private string m_Area_Name; public string Area_Name { get { return m_Area_Name; } set { m_Area_Name = value; } } private double m_Area_Order; public double Area_Order { get { return m_Area_Order; } set { m_Area_Order = value; } } } #endregion [Serializable] public class AreaLists : List<Area> { private int _maxItems = 0; public int MaxItems { get { return this._maxItems; } set { this._maxItems = value; } } } }