C# 以加载形式填充组合框,但触发器SelectedValueChanged
我想在加载表单时将数据表中的一些键/值填充到组合框中。当用户在组合框上进行选择时,一些语句会在SelectedValueChanged事件中执行 但是,当我使用以下方法填充数据时:C# 以加载形式填充组合框,但触发器SelectedValueChanged,c#,winforms,combobox,C#,Winforms,Combobox,我想在加载表单时将数据表中的一些键/值填充到组合框中。当用户在组合框上进行选择时,一些语句会在SelectedValueChanged事件中执行 但是,当我使用以下方法填充数据时: private void Form1_Load(object sender, EventArgs e) { comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; DataTable dt = new DataTa
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Rows.Add(1, "A1");
dt.Rows.Add(2, "A2");
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
}
使用以下SelectedValueChanged事件:
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
MessageBox.Show("FOO");
}
程序运行后,“foo”消息框会意外显示两次,然后用户才能选择任何内容
有什么问题
Thx问题在于设计,当您的组合框更新为新项目时,它的
SelectedValue
会因设计而改变。要防止出现这种情况,可以使用如下某种标志:
private bool init;
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Rows.Add(1, "A1");
dt.Rows.Add(2, "A2");
init = true;
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
init = false;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
if(!init) MessageBox.Show("FOO");
}
相反,在
表单加载
事件处理程序末尾填写组合框
后,通过设计器注册事件处理程序:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Rows.Add(1, "A1");
dt.Rows.Add(2, "A2");
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
comboBox1.SelectedValueChanged += comboBox1_SelectedValueChanged
}
添加到KINGKING的答案中。
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
if(init) Return;
//codes here
}
当您向
组合框中添加项目时,它最有可能触发事件。