如何在windows forms(C#)中动态添加combobox并将其绑定到sql数据库表的一列 [英] how to dynamically add combobox in windows forms(C#) and bound it to a column of a table in sql database

查看:11
本文介绍了如何在windows forms(C#)中动态添加combobox并将其绑定到sql数据库表的一列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My windows form has an ADD button which adds a combo box to the form after each click. The problem is, i am not able to bind it to a table column at run time. Using an existing databinding source selects the same value in all the combo boxes. I am coding in 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);

推荐答案

我在解决方案中添加了一个 DataSet 并删除了 Employees 表(来自 Northwind) 在设计器中,它会自动创建 employeesBindingSource.我在表单上放置了一个组合框和一个按钮,并设置了组合的 DataSourceDataMember.然后我处理了一些事件:

I added a DataSet to the solution and droped the Employees table (from Northwind) in the designer, which automatically created the employeesBindingSource. I dropped a combobox and a button on the Form and I set the DataSource and DataMember of the combo. Then I handled some events:

    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 表中的下一列(但是没有边界检查).

So on each click, a new combo is added onto the form dynamically right under the previous combo. The combo is also bound to the next column in the Employees table (no boundary checks however).

如您所见,这是非常简单的事情.希望这可以帮助.

As you can see, this is pretty easy stuff. Hope this helps.

好的,这里是代码的变体,可以帮助您解决您在此答案的评论中提出的其他问题.

Okay, so here is a variation of the code that could help you with that other question you asked in the comments of this answer.

假设您有一个带有按钮的表单和一个带有Employees表的DataSet.单击按钮时,它会创建一个组合,并用数据填充它(EmployeesName 列).每次添加组合时,它都会获得自己的数据副本(这对于一次从一个组合中删除项目很重要).然后,每次您在组合中选择一个值时,组合都会被禁用,其他组合在其列表中没有该选定值.

It assumes you have a Form with a button and a DataSet with table Employees. On button click it creates a combo, and fills it with data (the Name column of Employees). Each time you add a combo, it gets its own copy of the data (this is important to be able to remove items from one combo at a time). Then, every time you select a value in the combo, the combo is disabled and the other combos don't have that selected value in their list.

  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;
    }

这非常接近您的要求,或者很容易适应以满足您的期望.享受并请选择一个答案作为接受的答案.谢谢!

This is pretty close to what you require, or easily adaptable to meet your expectations. Enjoy and please select an answer as the accepted one. Thanks!

这篇关于如何在windows forms(C#)中动态添加combobox并将其绑定到sql数据库表的一列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆