ComboBox的DataSource属性可以是任何实现了ICollection接口的对象。下面的例子中的数据源是一个Datatable,它有两列,第一列是ID,存int型,第二列是Name,存姓名。设置数据源的时候,DisplayMember为ID字段,ValueMember为Name字段,ComboBox显示出来的是ID字段值,每个ID对对应一个Name值,感觉有些类似于哈希表。
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 WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private DataTable dt = new DataTable(); private bool blnLoad = true; private void button1_Click(object sender, EventArgs e) { MessageBox.Show(this.comboBox1.SelectedText); //输出为空字符串 } private void Form1_Load(object sender, EventArgs e) { DataColumn dc1 = new DataColumn("ID"); DataColumn dc2 = new DataColumn("Name"); dt.Columns.Add(dc1); dt.Columns.Add(dc2); DataRow dr1 = dt.NewRow(); DataRow dr2 = dt.NewRow(); DataRow dr3 = dt.NewRow(); DataRow dr4 = dt.NewRow(); dr1["ID"] = 1; dr1["Name"] = "zhangsan"; dr2["ID"] = 2; dr2["Name"] = "lisi"; dr3["ID"] = 3; dr3["Name"] = "wanger"; dr4["ID"] = 4; dr4["Name"] = "zhaosi"; dt.Rows.Add(dr1); dt.Rows.Add(dr2); dt.Rows.Add(dr3); dt.Rows.Add(dr4); this.comboBox1.DataSource = dt; this.comboBox1.DisplayMember = "ID"; this.comboBox1.ValueMember = "Name"; this.blnLoad = false;//判断formLoad的时候,是否激发comboBox1_SelectedValueChanged } private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { if (!this.blnLoad) { MessageBox.Show(this.comboBox1.SelectedValue.ToString()); } } //private void comboBox1_TextChanged(object sender, EventArgs e) //{ // if (!this.blnLoad) // { // MessageBox.Show(this.comboBox1.SelectedText); // } //} } }
关于它的一些属性:
1. SelectedValue:是当前选中的值,但不一定是显示出来的值,例如上例中,显示的是 1,但其值确是“zhagnsan”。
2. SelectedText:是combobox可编辑部分选中的部分,就是蓝底的那部分,而不是当前显示的值。注意:在点击Button1,并不能输出当前的SelectedText,原因是点击按钮时,焦点从combobox转移到Button1,combobox中选中的值(蓝底部分)会消失,即不再选中,所以通过其他控件的事件输出SelectedText,焦点转移,输出空字符串。
3.comboBox1_SelectedValueChanged函数在formLoad的时候,就被激发。为了让它在FormLoad时不被激发,增加一个bool变量,如例程所示。
4. 很多时候,combobox并不需要设置一个displaymember,一个valuemember,而只需要显示一个字段,显示的字段值本身就是它所需的值,这样的话,可以只设置valuemember属性,而不设置displaymember属性,即可保证显示的值为实际的值。