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

C# 将DataGridView中ComboBox的值与另一个单元格匹配,c#,winforms,datagridview,combobox,C#,Winforms,Datagridview,Combobox,我有一个带有组合框的DataGridView。 组合框中会填充特定的名称列表,并且它们在DataGridView中的每一行都是相同的 填写我的DataGridView后,我想执行以下操作: 我希望每个组合的值都设置为对应行的“表列”值(如果存在) 也就是说,在上面的图片中,我希望第一个组合的值是“id”(如果它包含一个名为“id”的项),第二个组合的值是“firstname”,等等 如果未找到该值,则不应在组合框中选择任何值 更新:我的当前代码不起作用 private void Mapping

我有一个带有组合框的
DataGridView
。 组合框中会填充特定的名称列表,并且它们在
DataGridView
中的每一行都是相同的

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

我希望每个组合的值都设置为对应行的“表列”值(如果存在)

也就是说,在上面的图片中,我希望第一个组合的值是“id”(如果它包含一个名为“id”的项),第二个组合的值是“firstname”,等等

如果未找到该值,则不应在
组合框中选择任何值

更新:我的当前代码不起作用

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

不久前,我做了一件类似的事情:

  • 识别哪些字段属于类型
    enum
  • 对于
    enum
    类型的字段,在
    DataGridView
    的单元格中显示一个
    组合框(包含
    enum
    的所有可能值),而不是简单的文本字段 我认为您只需更改代码的某些部分,即可将其转换为您想要实现的目标:

    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;
        }
    
    }
    
    public分部类TableView:Form
    {
    公共表视图(CollectionType元素)
    {
    初始化组件();
    //自定义:
    this.DataGridView.DataSource=元素;
    AdapteColumnStoColumnValueType();
    }
    private void AdapteColumnStoColumnValueType()
    {
    对于(int columnIndex=0;columnIndex
    不久前,我做了一件类似的事情:

  • 识别哪些字段属于类型
    enum
  • 对于
    enum
    类型的字段,在
    DataGridView
    的单元格中显示一个
    组合框(包含
    enum
    的所有可能值),而不是简单的文本字段 我认为您只需更改代码的某些部分,即可将其转换为您想要实现的目标:

    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;
        }
    
    }
    
    public分部类TableView:Form
    {
    公共表视图(CollectionType元素)
    {
    初始化组件();
    //自定义:
    this.DataGridView.DataSource=元素;
    AdapteColumnStoColumnValueType();
    }
    private void AdapteColumnStoColumnValueType()
    {
    对于(int columnIndex=0;columnIndex
    您可以使用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;
             }
        }
    

    您可以使用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;
             }
        }
    

    追踪变化你几乎做到了

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

    追踪变化你几乎做到了

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

    “到目前为止你做了什么?”穆米特更新了这个问题。请看一看!“到目前为止你做了什么?”穆米特更新了这个问题。请看一看!