我在这方面使用WinForm
,我有3个RadioButton
,一个ComboBox
,还有三个BindingSource
我希望当我检查任何一个RadioButton
时,来自特定DataSources
的值绑定到组合框的ValueMember
和DisplayMember
程序有一个SQL查询,我想根据选中的单选按钮向其中发送值。
private void rdbMed_CheckedChanged(object sender, EventArgs e)
{
cmbStock.DataSource = null;
cmbStock.DataSource = this.medicinesBindingSource;
this.cmbStock.DisplayMember = ""; //i want to bind "Med_ID" from medicinesBindingSource
this.cmbStock.ValueMember = ""; //"Med_Name"
}
private void rdbCat_CheckedChanged(object sender, EventArgs e)
{
cmbStock.DataSource = null;
cmbStock.DataSource = this.categoriesBindingSource;
this.cmbStock.DisplayMember = ""; //"category_Name"
this.cmbStock.ValueMember = ""; // category_ID"
}
private void rdbPharm_CheckedChanged(object sender, EventArgs e)
{
cmbStock.DataSource = null;
cmbStock.DataSource = this.pharmaceuticalBindingSource;
this.cmbStock.DisplayMember = "";// "Pharma_Name"
this.cmbStock.ValueMember = "";// "Pharma_ID"
}
波纹管是查询的参数。这将帮助你了解我想要实现的目标。
if (rdbMed.Checked)
{
con.cmd.Parameters.AddWithValue("@Med_ID", cmbStock.ValueMember);
con.cmd.Parameters.AddWithValue("@category_ID", "");
con.cmd.Parameters.AddWithValue("@Pharma_ID", "");
}
else if (rdbCat.Checked)
{
con.cmd.Parameters.AddWithValue("@Med_ID", "");
con.cmd.Parameters.AddWithValue("@category_ID", cmbStock.ValueMember);
con.cmd.Parameters.AddWithValue("@Pharma_ID", "");
}
else if (rdbPharm.Checked)
{
con.cmd.Parameters.AddWithValue("@Med_ID", "");
con.cmd.Parameters.AddWithValue("@category_ID", "");
con.cmd.Parameters.AddWithValue("@Pharma_ID", cmbStock.ValueMember);
}
最简单、最不痛苦的方法是在SQL命令中解决它,而实现这一点的方法是用AS VM
和AS DM
强制转换列,并生成DisplayMember = "DM"
和ValueMember = "VM"
,所以如果您有像SELECT USERID AS VM, NAME AS DM
或SELECT PRODUCTID AS VM, NAME AS DM
这样的SQL查询,这两种查询都可以工作。
稍后的问题是,如果您对代码做了一些操作,那么您可能会在尝试从数据绑定获取USERID
时出错,但实际上是VM
。为了避免这种情况,您可以在像SELECT USERID, NAME, ...., USERID AS VM, NAME AS DM
这样的查询中"双击"值,这样您的控件将有VM
和DM
,但仍保留原始列。