你可以在手动添加的DataGridViewComboBox上对DataGridView进行排序吗?

时间:2016-02-14 03:33:13

标签: c# winforms datagridview

我有一个DataGridView,它是从绑定到绑定源的DataTable中填充的。我通过DataTable的ColumnMapping

隐藏了一列
dataTable.Columns[“ZoneId“].ColumnMapping = MappingType.Hidden;

我已将DataGridView的DataBindingComplete事件绑定到一个方法,该方法遍历查看DataBound ZoneId列的行,然后将行的ComboBox设置为与ZoneId匹配。

for (int i = 0; i < dataGridView.Rows.Count - 1; i++) {  //Count-1 to ignore the editing row
  // This is the DataGridView row, a subset of the backing data plus the combo and button cells
  DataGridViewRow row = dataGridView.Rows[i];
  // This is the full backing data for the row
  DataRowView dataRow = (DataRowView)row.DataBoundItem;
  if (dataRow != null) {
    // Find cell with comboBox by name 
    DataGridViewComboBoxCell cell = DataGridViewComboBoxCell)row.Cells["ZoneIdComboBox"];
    if (cell != null) {
      Id = (string)dataRow["ZoneId"];
      cell.Value = Id;
    }
  }
}

ComboBox的值等于存储在表中的隐藏列值(ID)。 Text部分是该值的可读描述。它们由数据库中的单独表定义。这两个表也有关系,所以我的主表中的ZoneId必须在我的ComboBox表中输入Id。

我可以单击任何常规绑定列的标题并对表进行排序。我希望能够单击ComboBox列并对文本条目进行排序。

1 个答案:

答案 0 :(得分:0)

真正的解决方案是设置AutoGenerateColumns = false。然后手动创建所有列。我在最初加载DataGridView时执行此操作。之后我不必再做了。

private DataGridViewComboBoxColumn MakeDataGridViewComboBoxColumn(string fieldName, string headerText, DataGridViewColumnSortMode sortMode, bool readOnly)
{
  DataGridViewComboBoxColumn result = new DataGridViewComboBoxColumn();
  result.Name = fieldName;
  result.DataPropertyName = fieldName;
  result.HeaderText = headerText;
  result.SortMode = sortMode;
  result.ReadOnly = readOnly;
  return result;
}

之后,我使用单独的DataSource填充ComboBox列,列表或数据表。

private void QueueBindZoneColumn()
{
  // The available ZoneId list may have been edited, so get a fresh copy
  DataGridViewComboBoxColumn c = (DataGridViewComboBoxColumn)dgv1.Columns["ZoneId"];
  if (c != null) {
    c.ValueType = typeof(string);
    List<Data.Zone> ZoneList;
    if (Data.LoadZoneId.Load(txtConnectionString.Text, out ZoneList)) {
      c.DataSource = ZoneList;
      c.DisplayMember = "ZoneDescription";    //List class member name to display as descriptions
      c.ValueMember = Data.FieldNameHandling.Id;  //List class member name to use as the stored value
    }
  }
}

分配DataGridView BindingSource时,会设置ComboBox值,因为表的fieldName与ComboBox的DataPropertyName匹配。

最棒的是,这意味着我不必手动处理将ComboBox更改中的数据分配给后备存储数据,就像我一样。

它还处理数据的更改,我现在需要更长时间来验证ComboBox。

加载数据后,我可以根据ComboBox中的值对行进行排序。我可以覆盖Sort方法来对Text信息进行排序。