2016-03-03 166 views
1

我有一个DataGridViewComboBox列。 组合框被填入特定的名称列表,它们在DataGridView中的每一行都相同。将DataGridView中ComboBox的值与另一个单元匹配

我填补我DataGridView后,我想做到以下几点:

我希望每一个组合的值设置为相应行的“表列”的值,如果存在。

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

你已经完成的工作? – Moumit

+0

@Moumit更新了问题。请看一下! – Disasterkid

+0

查看我的回答 – Moumit

回答

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

天才!谢谢! – Disasterkid

0

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

  1. 识别哪些字段的类型enum
  2. 为fiels类型为enum,在DataGridView的单元格中显示ComboBox(包含01的所有可能值)而不是简单的文本字段。

我想你只需要改变代码的某些部分将其转换到你想达到什么目的:

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

} 
0

可以使用DataGridViews RowsAdded事件。

编辑:中巴是你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; 
     } 
    } 
相关问题