C# 将DataGridView绑定到DataTable,但还包括一个ComboBox作为最后一列

C# 将DataGridView绑定到DataTable,但还包括一个ComboBox作为最后一列,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,现在,我有一个DataGridView,它绑定到一个工作良好的DataTable。我需要在DataGridView上做的是在最末端包含一个新列,它是一个组合框,将根据行的键值动态填充 我的列是ID、Name和Count。第四列将是一个组合框,它接受一个ID并基于该ID在下拉列表中创建值。我目前有一个自定义组合框,它在构造函数中接受一个ID并以这种方式填充它,但我无法找到一种方法将其放入DataGridView。因此,我创建了该自定义ComboBox控件的副本,并将其制作成DataGridView

现在,我有一个DataGridView,它绑定到一个工作良好的DataTable。我需要在DataGridView上做的是在最末端包含一个新列,它是一个组合框,将根据行的键值动态填充

我的列是ID、Name和Count。第四列将是一个组合框,它接受一个ID并基于该ID在下拉列表中创建值。我目前有一个自定义组合框,它在构造函数中接受一个ID并以这种方式填充它,但我无法找到一种方法将其放入DataGridView。因此,我创建了该自定义ComboBox控件的副本,并将其制作成DataGridViewComboBoxCell,但我仍然不知道如何将其动态绑定到表单。我浏览了互联网,找到了一些例子,但并不完全是我想做的


显示了我想要做的事情,除了我使用的是C而不是VB。有什么想法吗?

你可以这样做,但我(在VB中)处理它的方法是将DGV绑定到一个对象集合,其中包含一些超出实际绑定数据范围的额外成员。我使用这些额外的成员作为额外内容的占位符

我将数据源中的元素(在我的例子中是DB)填充到集合中,根据需要填充其他成员,然后将集合绑定到DGV。因为额外的成员不是原始表的成员,所以我可以更改它们的内容。然后我就不必像您希望的那样处理控件的“部分绑定”


无论如何,还有另一种剥猫皮的方法。

以下是我刚刚尝试过的:

DataTable dt = new DataTable();
            dt.Columns.Add("Col");
            dt.Rows.Add();
            dt.Rows.Add();
            dt.Rows.Add();
            dt.Rows[0][0] = "1";
            dt.Rows[1][0] = "2";
            dt.Rows[2][0] = "3";
            dataGridView1.DataSource = dt;

            dataGridView1.Columns.Add(new DataGridViewComboBoxColumn());

            List<string> lstStr = new List<string>();
            lstStr.Add("1");
            lstStr.Add("2");
            lstStr.Add("3");
            lstStr.Add("4");

            ((DataGridViewComboBoxCell)(dataGridView1.Rows[0].Cells[1])).DataSource = lstStr;
DataTable dt=newdatatable();
dt.列。添加(“列”);
dt.Rows.Add();
dt.Rows.Add();
dt.Rows.Add();
dt.行[0][0]=“1”;
dt.行[1][0]=“2”;
dt.行[2][0]=“3”;
dataGridView1.DataSource=dt;
添加(新的DataGridViewComboxColumn());
List lstStr=新列表();
lstStr.添加(“1”);
lstStr.添加(“2”);
lstStr.添加(“3”);
lstStr.添加(“4”);
((DataGridViewComboxCell)(dataGridView1.Rows[0].Cells[1])).DataSource=lstStr;
这就是你要找的吗?

试试这个:

// Create a new Combo Box Column

DataGridViewComboBoxColumn EmpIdColumn = new DataGridViewComboBoxColumn();

// Set the DataSource of EmpIdColumn as bellow

EmpIdColumn.DataSource = myDataSet.Tables[0];

// Set the ValueMember property as done bellow 

EmpIdColumn.ValueMember = myDataSet.Tables[0].Columns[0].ColumnName.ToString();

// Set the DisplayMember property as follow

EmpIdColumn.DisplayMember = EmpIdColumn.ValueMember;

我想这样做,但同时希望保持这种重量轻,不必创建一个全新的定制类。。。不过我会记住这一点。不完全是这样,我需要做的是根据数据表第1列中的任何内容动态构建下拉列表。如果不需要的话,我不想对数据进行两次传递——我宁愿在添加行时获得组合框列表。不过,我不知道是否有一个事件可以在其中完成。datagridview有一个UserAddDrow和RowAdded事件。如果我是从数据源填充,RowsAdded会一次完成所有行。看起来我可能需要通过一次来加载数据,一次来填充下拉列表…我现在正在做其他事情,但当我有时间的时候,我会回去看看这是否按照我认为应该的方式工作。谢谢