如何在绑定后更改DataGridView列类型

时间:2017-10-12 15:35:29

标签: c# datagridview combobox datagridviewcolumn datagridviewcombobox

我已经加载了一个名为dgvPrint的DataGridView,其中包含一个List,它从数据库中检索如下:

dgvPrint.DataSource = ReservedServices.GetAll();

结果如下:

initial data

Worker列和ServiceType列是一些整数,它们引用两个表的主键。

如何将ServiceTypeWorker的列类型从简单文本更改为DataGridViewComboBoxColumn

注1:这两列的当前值是相应ComboBox的ValueMember

注2:我想保留其他列的数据和位置。

我已将此代码用于Worker列,但它无法正常运行:

DataGridViewComboBoxColumn colbox;
colbox = (DataGridViewComboBoxColumn)dgvPrintServices.Columns[4];
colbox.DataSource = WorkerServices.GetAll(); // a list of worker with Id and Name
colbox.DisplayMember = "Name";
colbox.ValueMember = "Id";
dgvPrint.Columns.Add(colbox);

1 个答案:

答案 0 :(得分:0)

您必须首先定义并向DataGridView添加列(使用VS中的GUI或按照示例下的代码),设置正确的.DataPropertyName。其中一列将是Worker列,它还将包含额外的代码,即您在帖子中列出的代码。然后然后添加数据源。

换句话说,我认为您的代码是正确的,但是分配数据源和设置列属性的顺序必须改变。

VB.NET:

    With WIcol4
        .Width = "120"
        .HeaderText = "Worker"
        .DataPropertyName = "Worker"
        .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
        .DefaultCellStyle.Padding = New Padding(0, 0, 6, 0)
        .DropDownWidth = 300
        .Name = .DataPropertyName
        .DataSource = dtWorker
        .ValueMember = "ID"
        .DisplayMember = "Name"
        .ReadOnly = False
    End With

    Me.dgwOps.Columns.Add(WIcol4)

C#:

    var _with1 = WIcol4;
   _with1.Width = "120";
   _with1.HeaderText = "Worker";
   _with1.DataPropertyName = "Worker";
   _with1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
   _with1.DefaultCellStyle.Padding = New Padding(0, 0, 6, 0);
   _with1.DropDownWidth = 300;
   _with1.Name = _with1.DataPropertyName;
   _with1.DataSource = dtWorker;
   _with1.ValueMember = "ID";
   _with1.DisplayMember = "Name";
   _with1.ReadOnly = False;

   this.dgwOps.Columns.Add(WIcol4);

注意,对于要写入的列, DataGridView和列必须是ReadOnly = False。