我正在尝试将Combobox2上的Combobox2填充为从windows窗体应用程序中的同一个表中更改的selectText。我正在使用sql serevr 2008数据库。我无法在组合框选择的文本更改时填充combobox2。
以下是我的尝试:
private void Purchase_Load(object sender, EventArgs e)
{
fillName();
comboBoxName.SelectedIndex = -1;
}
private void comboBoxName_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBoxName.SelectedText != "")
{
fillMake();
}
}
private void fillName()
{
SqlConnection con = new SqlConnection(@"Data Source=ashish-pc\;Initial Catalog=HMS;Integrated Security=True");
con.Open();
string str = "Select Item_Name from Item";
SqlCommand cmd = new SqlCommand(str, con);
SqlDataAdapter adp = new SqlDataAdapter(str, con);
DataTable dtItem = new DataTable();
adp.Fill(dtItem);
cmd.ExecuteNonQuery();
comboBoxName.DataSource = dtItem;
comboBoxName.DisplayMember = "Item_Name";
comboBoxName.ValueMember = "Item_Make";
}
private void fillMake()
{
SqlConnection con = new SqlConnection(@"Data Source=ashish-pc\;Initial Catalog=HMS;Integrated Security=True");
con.Open();
string str = "Select Item_Make from Item Where Item_Name='" + comboBoxName.SelectedText + "'";
SqlCommand cmd = new SqlCommand(str, con);
SqlDataAdapter adp = new SqlDataAdapter(str, con);
DataTable dtItem = new DataTable();
adp.Fill(dtItem);
cmd.ExecuteNonQuery();
comboBoxName.DataSource = dtItem;
comboBoxName.DisplayMember = "Item_Make";
comboBoxName.ValueMember = "Item_Name";
comboBoxName.SelectedIndex = -1;
comboBoxName.Text = "Select";
}
项目的
的SQL服务器表Item_Code Item_Name Item_Make Item_Price UnitofMeasurement
Cable anchor 45.0000 meter
Cable polycab 30.0000 meter
Button anchor 15.0000 unit
Button havells 20.0000 unit
Switch cona 70.0000 unit
我搜索了解决方案,但很不幸。 请帮帮我。 提前谢谢。
答案 0 :(得分:5)
要弄清楚你尝试做什么有点困难,但听起来你正在尝试填充第二个组合框(comboBoxMake
?),具体取决于所选择的内容comboBoxName
。我基于这个假设得出这个答案。如果我有这个错误,请道歉。
此代码中有许多需要注意的事项。我们先来看fillName()
。
private void fillName()
{
SqlConnection con = new SqlConnection(@"Data Source=ashish-pc\;Initial Catalog=HMS;Integrated Security=True");
con.Open();
string str = "Select Item_Name from Item";
SqlCommand cmd = new SqlCommand(str, con);
SqlDataAdapter adp = new SqlDataAdapter(str, con);
DataTable dtItem = new DataTable();
adp.Fill(dtItem);
cmd.ExecuteNonQuery();
comboBoxName.DataSource = dtItem;
comboBoxName.DisplayMember = "Item_Name";
comboBoxName.ValueMember = "Item_Make";
}
您需要Dispose()
数据库对象。这可以通过using { .. }
块非常干净地完成。
您不需要手动打开连接;用数据适配器填充表 自动完成。
您不需要拨打ExecuteNonQuery()
。
您应该使用带有命令对象的SqlDataAdapter
构造函数重载,因为您已经手动创建了命令。
最后,根据我对您的目标的假设,我在您的查询中添加了distinct
,因此它只会获得唯一的Item_Name
。
private void fillName()
{
string str = "Select distinct Item_Name from Item";
using (SqlConnection con = new SqlConnection(@"Data Source=ashish-pc\;Initial Catalog=HMS;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand(str, con))
{
using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
{
DataTable dtItem = new DataTable();
adp.Fill(dtItem);
comboBoxName.DataSource = dtItem;
comboBoxName.DisplayMember = "Item_Name";
comboBoxName.ValueMember = "Item_Name";
}
}
}
}
开到fillMake()
。我在上面提到过同样的建议。此外:
参数化您的SQL。 参数化您的SQL 。这不仅远比将SQL连接起来更安全,而且更清晰。说真的,请阅读SQL注入:http://en.wikipedia.org/wiki/SQL_injection
原始帖子中的fillMake()
方法似乎正在重新填充comboBoxName
。它是否正确?你提到了两个组合框,但你的代码只引用了一个。我假设你的意思是在这里填充另一个组合框(comboBoxMake
?):
private void fillMake()
{
string str = "Select Item_Make from Item Where Item_Name = @item_name";
using (SqlConnection con = new SqlConnection(@"Data Source=ashish-pc\;Initial Catalog=HMS;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand(str, con))
{
cmd.Parameters.AddWithValue("@item_name", comboBoxName.Text);
using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
{
DataTable dtItem = new DataTable();
adp.Fill(dtItem);
comboBoxMake.DataSource = dtItem;
comboBoxMake.DisplayMember = "Item_Make";
comboBoxMake.ValueMember = "Item_Make";
comboBoxMake.SelectedIndex = -1;
comboBoxMake.Text = "Select";
}
}
}
}
最后,更改事件处理程序中的代码,使其查看Text
而不是SelectedText
属性:
private void comboBoxName_SelectedIndexChanged(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(comboBoxName.Text)) // Text instead of SelectedText
{
fillMake();
}
}