如何在windows窗体(C#)中动态添加combobox并将其绑定到sql数据库中表的一列

如何在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

“我的windows窗体”有一个“添加”按钮,它在每次单击后向窗体添加一个组合框。问题是,我无法在运行时将其绑定到表列。使用现有数据绑定源在所有组合框中选择相同的值。我正在用C语言编写代码#

以下是示例代码:

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,请看我答案的第二部分。