将DataGridView中的ComboBox值与另一个单元格匹配

时间:2016-03-03 12:02:13

标签: c# winforms datagridview combobox

我的DataGridView列有ComboBox列。 ComboBox填充了一个特定的名称列表,它们对于DataGridView中的每一行都是相同的。

填写DataGridView后,我想执行以下操作:

我希望每个Combo的值都设置为相应行的“Table Columns”值(如果存在)。

enter image description here

即。在上图中我希望第一个Combo的值为“id”(如果它包含名为“id”的项目),第二个为“firstname”等等。

如果找不到该值,则不应在ComboBox中选择任何值。

更新:我当前的代码无效

private void Mappings_Load(object sender, EventArgs e)
{       
    dgv.DataSource = tableColumns.Select(x => new { Value = x }).ToList();
    dgv.Columns[0].HeaderText = "Table Columns";
    DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
    comboColumn.HeaderText = "File Columns";
    foreach (var item in fileColumns)
        comboColumn.Items.Add(item);
    dgv.Columns.Add(comboColumn);
    foreach(DataGridViewRow row in dgv.Rows)
    {
        string tableColumnValue = row.Cells[0].Value.ToString();
        row.Cells[0].Value = tableColumnValue;           
    }
}

3 个答案:

答案 0 :(得分:0)

前段时间我做了类似的事情:

  1. 识别哪些字段属于enum
  2. 类型
  3. 对于enum类型的fiel,在ComboBox的单元格中显示DataGridView(包含enum的所有可能值)而不是简单文本领域。
  4. 我认为您只需要更改代码的某些部分,将其转换为您要实现的目标:

    public partial class TableView<CollectionType, ItemType> : Form
    {
    
        public TableView(CollectionType elements)
        {
    
            InitializeComponent();
    
            // custom:
            this.DataGridView.DataSource = elements;
            AdaptColumnsToColumnValueType();
    
        }
    
        private void AdaptColumnsToColumnValueType()
        {
            for (int columnIndex = 0; columnIndex < this.DataGridView.Columns.Count; columnIndex++)
            {
                var column = (DataGridViewColumn)this.DataGridView.Columns[columnIndex];
                if (column.ValueType.IsEnum)
                {
                    ReplaceColumnInDatagridView(
                        oldColumn: column,
                        newColumn: CreateComboBoxWithEnums(column));
                }
            }
        }
    
        private void ReplaceColumnInDatagridView(DataGridViewColumn oldColumn, DataGridViewColumn newColumn)
        {
            int columnIndex = oldColumn.Index;
            this.DataGridView.Columns.Remove(oldColumn);
            this.DataGridView.Columns.Insert(columnIndex, newColumn);
        }
    
        private DataGridViewComboBoxColumn CreateComboBoxWithEnums(DataGridViewColumn replacedEnumColumn)
        {
            var comboboxColumn = new DataGridViewComboBoxColumn();
            comboboxColumn.DataSource = Enum.GetValues(replacedEnumColumn.ValueType);
            comboboxColumn.DataPropertyName = replacedEnumColumn.DataPropertyName;
            comboboxColumn.Name = replacedEnumColumn.Name;
            return comboboxColumn;
        }
    
    }
    

答案 1 :(得分:0)

您可以使用DataGridViews RowsAdded事件。

编辑:cmb是你的ComboBoxColumn

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
   //Check if comboboxcolumn contains the value                
   if(cmb.Items.Contains(dataGridView1.Rows[e.RowIndex].Cells[0].Value)) {
   //Set the value
     dataGridView1.Rows[e.RowIndex].Cells["cmb"].Value = dataGridView1.Rows[e.RowIndex].Cells[0].Value;
         }
    }

答案 2 :(得分:0)

追踪变化.. 你几乎做到了

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] tableColumns = new string[] { "A", "B", "C", "D" };

        string[] fileColumns = new string[] { "A", "B", "C", "X" };

        dgv.DataSource = tableColumns.Select(x => new { Value = x }).ToList();

        dgv.Columns[0].HeaderText = "Table Columns";
        DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
        comboColumn.HeaderText = "File Columns";
        foreach (var item in fileColumns)
            comboColumn.Items.Add(item);
        dgv.Columns.Add(comboColumn);

        foreach (DataGridViewRow row in dgv.Rows)
        {
            string tableColumnValue = row.Cells[0].Value.ToString();

            //Change is here
            if (fileColumns.Any(i => i == tableColumnValue))
            {
                row.Cells[1].Value = tableColumnValue;
            }
            //end change
        }
    }