在 datagridview 内的组合框中设置值

Posted

技术标签:

【中文标题】在 datagridview 内的组合框中设置值【英文标题】:set value in combobox inside datagridview 【发布时间】:2015-10-05 01:01:28 【问题描述】:

我有内部带有组合框的 Datagridview,我无法在代码中设置索引 我读过this 和this - 两者都不起作用。

这是我的代码:

  dgShuffle.DataSource = dtCards;
  DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
  cmb.HeaderText = "Select Data";
  cmb.Name = "cmb";
  cmb.MaxDropDownItems = 2;
  cmb.Items.Add("real");
  cmb.Items.Add("sham");

  dgShuffle.Columns.Add(cmb);
  for (int i = 0; i < dgShuffle.RowCount; i++)
  
       (dgShuffle.Rows[i].Cells[6] as DataGridViewComboBoxCell).Value = "real";
        // dgShuffle.Rows[i].Cells[6].Value = "real";
  

通过代码设置我的意思是:以编程方式(取决于数据表中的值)。 我根本不会出错。该值根本不会显示在组合框中

我检查了组合框的索引,这是正确的,在我的即时窗口的输出下方:

?dgShuffle.Rows[i].Cells[6]

DataGridViewComboBoxCell ColumnIndex=6, RowIndex=0 [System.Windows.Forms.DataGridViewComboBoxCell]: DataGridViewComboBoxCell ColumnIndex=6, RowIndex=0 基数:DataGridViewComboBoxCell ColumnIndex=6, RowIndex=0 AccessibilityObject:System.Windows.Forms.DataGridViewCell.DataGridViewCellAccessibleObject 列索引:6 内容边界:X = 0 Y = 12 宽度 = 0 高度 = 0 上下文菜单条:空 默认新行值:空 显示:假 编辑格式化值:“” EditType: Name = "DataGridViewComboBoxEditingControl" FullName = "System.Windows.Forms.DataGridViewComboBoxEditingControl" ErrorIconBounds: X = 0 Y = 0 宽度 = 0 高度 = 0 错误文本:“” 格式化值:“” FormattedValueType: Name = "String" FullName = "System.String" 冻结:假 有样式:假 InheritedState:可调整大小 |可调整大小集 |可见的 InheritedStyle: DataGridViewCellStyle BackColor=Color [Window], ForeColor=Color [ControlText], SelectionBackColor=Color [Highlight], SelectionForeColor=Color [HighlightText], Font=[Font: Name=Microsoft Sans Serif, Size=7.8, Units= 3、GdiCharSet=177、GdiVerticalFont=False]、WrapMode=False、Alignment=MiddleLeft IsInEditMode:假 OwningColumn: DataGridViewComboBoxColumn Name=cmb, Index=6 OwningRow: DataGridViewRow 索引=0 PreferredSize: 宽度 = 43 高度 = 26 只读:假 可调整大小:真 行索引:0 选择:假 尺寸:宽度 = 100 高度 = 24 样式:DataGridViewCellStyle 标签:空 工具提示文本:“” 值:空 值类型:Name = "Object" FullName = "System.Object" 可见:真

下一次尝试:

    我创建了一个新的 winforms 项目 将 datagridview 拖到默认表单(从工具箱中)

    将此代码复制到 Form1_Load :

        DataTable dtCards;
        dtCards = new DataTable();
        dtCards.Columns.Add("printedString");
        dtCards.Rows.Add("1");
        dtCards.Rows.Add("2");
        dtCards.Rows.Add("3");
        dtCards.Rows.Add("4");
        dataGridView1.DataSource = dtCards;
    
        DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
        cmb.HeaderText = "Select Data";
        cmb.Name = "cmb";
        cmb.MaxDropDownItems = 2;
        cmb.Items.Add("real");
        cmb.Items.Add("sham");
    
        dataGridView1.Columns.Add(cmb);
        for (int i = 0; i < dataGridView1.RowCount; i++)
        
            (dataGridView1.Rows[i].Cells[6] as DataGridViewComboBoxCell).Value = "real";
            // dgShuffle.Rows[i].Cells[6].Value = "real";
        
    

我错过了什么???

【问题讨论】:

“我无法在代码中设置索引”是什么意思?你的目标到底是什么? try/catch 包裹它,你会收到错误吗?我不明白需要强制转换,代码 dgShuffle.Rows[i].Cells[6].Value = "real"; 应该可以正常工作,只要该值在下拉列表中可用。 不太明白你的问题。我刚刚测试了你的代码块,它工作正常。您是否设置了错误的列索引? 我编辑了我的问题。 您的 ComboBoxColumn 显示,您可以在运行时更改其值但不能以编程方式? Ps:仍然没有在您的代码中看到任何错误。您能否提供影响您的 DataGridView 的其他代码?也许尝试删除您的 DataGridView 并创建一个新的以避免设计时错误? 【参考方案1】:

您正在使用绑定到数据源的 datagridview。您需要在数据源中指定该值。

在数据源中为 DataGridViewComboBoxColumn 添加值 然后将DataGridViewComboBoxColumn.DataPropertyName 设置为数据源的列/属性的名称

DataTable dtCards;
dtCards = new DataTable();
dtCards.Columns.Add("printedString");
dtCards.Columns.Add("comboboxValue", typeof(String)); //adding column for combobox
dtCards.Rows.Add("1", "real");
dtCards.Rows.Add("2", "real");
dtCards.Rows.Add("3", "real");
dtCards.Rows.Add("4", "real");


DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
cmb.HeaderText = "Select Data";
cmb.Name = "cmb";
cmb.MaxDropDownItems = 2;
cmb.Items.Add("real");
cmb.Items.Add("sham");
cmb.DataPropertyName = "comboboxValue"; //Bound value to the datasource

dataGridView1.Columns.Add(cmb);
dataGridView1.DataSource = dtCards;

【讨论】:

但是如果我想根据我输入到组合框的值来过滤组合框呢? 是否可以为同一个列表中的不同行设置不同的组合框值? @Dimi,组合框列的数据源在所有行之间共享。要为不同的行获取不同的项目 - 您应该为每个组合框单元格设置自己的项目集合。检查这个:https://***.com/a/27202221/1565525

以上是关于在 datagridview 内的组合框中设置值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据索引在数据框中设置值[重复]

如何在数据库中包含引号的文本框中设置值?

Angular - 在另一个组件的输入文本框中设置值

DataGridView 与组合框列显示 System.Data.DataRowView 而不是 DisplayMember

JS/jQuery:使用下拉框在另一个字段中设置值,是不是正在更改以前的字段?

Kendo DateTimePicker 从 json 结果中设置值