我使用以下函数填充ComboBox
public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName, string AValue, string Adisplay)
{
string Value = AValue;
string display = Adisplay;
using (var CONN = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\Test.accdb;"))
{
CONN.Open();
DataTable dt = new DataTable();
try
{
OleDbCommand cmd = new OleDbCommand(Query, CONN);
OleDbDataReader myReader = cmd.ExecuteReader();
dt.Load(myReader);
}
catch (OleDbException e)
{
MessageBox.Show(e.ToString());
return;
}
DropDownName.DataSource = dt;
DropDownName.ValueMember = Value;
DropDownName.DisplayMember = display;
}
}
我在加载表单中调用它:
private void Form1_Load(object sender, EventArgs e)
{
FillDropDownList("select CountryCode,Countryname from Countries", comboBox1, "CountryCode", "Countryname");
}
2.之后我在Selectedindexchanged事件中使用相同的函数来填充另一个ComboBox:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName");
}
对于两个组合框的人口一切正常,但问题就在这里 我有两个组合框,如图所示:
所以第一个组合框(国家)完美地加载了形式 但我想要做的是只在我选择国家时才从数据库中选择第二个组合框(状态),但是会发生什么,代码运行,第二个组合框从数据库中选择,无论是什么,第一个组合中的选定索引如图所示
所以我基本上想要做的是只在我从第一个组合框中选择索引时才填充第二个Combo。
答案 0 :(得分:1)
将您的代码放在SelectionChangeCommitted
而不是SelectedIndexChanged
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName");
}
答案 1 :(得分:0)
我认为你的问题是原因,因为第一个组合框的填充会触发事件以填充第二个组合框。解决这个问题的方法是在comboBox1_SelectedIndexChanged(对象发送者,EventArgs e)中使用以下内容。
if (comboBox1.Text == string.Empty) { return; }
如果不起作用,请尝试使用“SelectedIndex> 0”或“SelectedValue”属性。
作为一个注意事项,如果有人能够修改您的组合框项目,您的代码可能容易受到SQL注入攻击。
答案 2 :(得分:0)
您需要使用SelectedIndex
属性来确定该项目是否真的从Combobox更改。
试试这个:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if(comboBox1.SelectedIndex >= 0)
{
FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName");
}
}
答案 3 :(得分:0)
将以下方法更改为
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName");
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1 && comboBox2.SelectedIndex != -1 )
{
FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName");
}
}
在提交查询数据库之前,您需要验证两个组合框。检查是否有任何选定的项目。
由于 SRIKANTH
答案 4 :(得分:0)
在调用SelectedIndexChanged
方法之前删除FillDropDownList
事件处理程序,并在填充ComboBox
后重新应用它。
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged;
FillDropDownList("select CountryCode,Countryname from Countries", comboBox1, "CountryCode", "Countryname");
comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
}