如何在windows窗体(C#)中动态添加combobox并将其绑定到sql数据库中表的一列
“我的windows窗体”有一个“添加”按钮,它在每次单击后向窗体添加一个组合框。问题是,我无法在运行时将其绑定到表列。使用现有数据绑定源在所有组合框中选择相同的值。我正在用C语言编写代码# 以下是示例代码:如何在windows窗体(C#)中动态添加combobox并将其绑定到sql数据库中表的一列,c#,.net,winforms,combobox,C#,.net,Winforms,Combobox,“我的windows窗体”有一个“添加”按钮,它在每次单击后向窗体添加一个组合框。问题是,我无法在运行时将其绑定到表列。使用现有数据绑定源在所有组合框中选择相同的值。我正在用C语言编写代码# 以下是示例代码: ComboBox ocbNext = new ComboBox(); //HAVE set the rest of the properties right, the problem is with the databinding ocbNext.DataSource = this.dum
ComboBox ocbNext = new ComboBox();
//HAVE set the rest of the properties right, the problem is with the databinding
ocbNext.DataSource = this.dummysubjectBindingSource;
ocbNext.DisplayMember = "sub_name";
ocbNext.ValueMember = "sub_name";
this.Controls.Add(ocbNext);
如果您在clickevent中创建一个新的本地ComboBox变量,就可以了。如果您对组合框使用全局变量,这可能会解释您的问题。但是如果没有示例,你很难看到真正发生了什么,所以我认为这只是一个粗略的猜测我在解决方案中添加了一个数据集,并在designer中删除了Employees表(来自Northwind),该表自动创建了employeesBindingSource。我在表单上删除了一个组合框和一个按钮,然后设置组合的数据源和数据成员。然后我处理了一些事件:
private void Form1_Load(object sender, EventArgs e)
{
this.employeesTableAdapter.Fill(this.dS.Employees);
}
private int _i = 0;
private void button1_Click(object sender, EventArgs e)
{
ComboBox combo = new ComboBox();
combo.DataSource = this.employeesBindingSource;
combo.DisplayMember = this.dS.Tables[0].Columns[++_i].ColumnName;
combo.Location = new Point(comboBox1.Location.X, comboBox1.Location.Y + comboBox1.Height * _i);
this.Controls.Add(combo);
}
因此,每次单击时,都会在上一个组合的正下方动态地将一个新组合添加到表单中。组合还绑定到Employees表中的下一列(但是没有边界检查)
正如你所看到的,这是非常简单的事情。希望这有帮助
好的,这里是代码的一个变体,它可以帮助你解决你在这个答案的评论中提出的另一个问题 它假设您有一个带有按钮的表单和一个带有表Employees的数据集。单击按钮,它将创建一个组合,并用数据(员工姓名列)填充该组合。每次添加组合时,它都会获得自己的数据副本(一次能够从一个组合中删除项目非常重要)。然后,每次您在组合中选择一个值时,组合将被禁用,而其他组合的列表中没有该选定值
private int _i = 0;
private void button1_Click(object sender, EventArgs e)
{
DataSet dataS = dS.Clone();
this.employeesTableAdapter.Fill((DS.EmployeesDataTable)dataS.Tables[0]);
BindingSource bindSource = new BindingSource(dataS, "Employees");
ComboBox combo = new ComboBox();
combo.Name = this.dS.Tables[0].Columns[0].ColumnName + (++_i).ToString();
combo.DataSource = bindSource;
combo.DisplayMember = this.dS.Tables[0].Columns[1].ColumnName; //This column is the Name of Employee
combo.Location = new Point(button1.Location.X, button1.Location.Y + combo.Height * _i);
combo.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);
this.Controls.Add(combo);
}
private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is ComboBox && ctrl != sender && ctrl.Enabled)
{
((BindingSource)((ComboBox)ctrl).DataSource).RemoveAt(((ComboBox)sender).SelectedIndex);
}
}
((ComboBox)sender).Enabled = false;
}
这与您的需求非常接近,或者易于调整以满足您的期望。享受并请选择一个答案作为接受答案。谢谢 选项1:用字符串填充组合框:
this.comboBox1.Items.Add("Syed");
this.comboBox1.Items.Add("Baqar");
选项2:用字符串数组填充组合框:
this.comboBox1.Items.AddRange(new object[] { "Syed", "Baqar" });
您需要先将控件添加到父窗口,然后设置数据源
ComboBox ocbNext = new ComboBox();
this.Controls.Add(ocbNext);
ocbNext.DisplayMember = "sub_name";
ocbNext.ValueMember = "sub_name";
ocbNext.DataSource = this.dummysubjectBindingSource;
看起来你已经回答了问题的第一部分。对于第二部分,它应该相当容易实现。让我们看看到目前为止您得到了什么…嘿,tzup问题在于ocbNext.DataSource=this.dummysubjectBindingSource;它与我为静态显示组合框添加的数据绑定源相同,当我为动态添加的cmbo框使用相同的数据绑定源时,问题就开始了。初始数据绑定源是通过向导添加的…我不知道如何添加一个DynamicAllyTNX tzup…它实际上是ws simple n it hlpd。请让我确认用户为每个组合框选择了不同的值??我的意思是有没有办法禁用已经选择的值???嗨,Raghav,请看我答案的第二部分。