是否可以在手动添加的DataGridView组合框上对DataGridView进行排序

本文关键字:DataGridView 组合 排序 添加 是否 | 更新日期: 2023-09-27 18:34:27

我有一个从绑定到绑定源的DataTable填充的DataGridView。我通过数据表的列映射隐藏了一列

dataTable.Columns[“ZoneId“].ColumnMapping = MappingType.Hidden;

我已将 DataGridView 的 DataBindingComplete 事件绑定到一个方法,该方法循环访问查看 DataBound ZoneId 列的行,然后将行的组合框设置为与 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;
    }
  }
}

组合框的值等于表中存储的隐藏列值 (ID)。文本部分是该值的人类可读描述。它们由数据库中的单独表定义。此外,这两个表具有关系,因此我的主表中的 ZoneId 必须在我的 ComboBox 表中管理一个 Id。

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

是否可以在手动添加的DataGridView组合框上对DataGridView进行排序

真正的解决方案是设置 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;
}

之后,我使用单独的数据源填充 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 绑定源时,将设置 ComboBox 值,因为表的字段名称与 ComboBox 的DataPropertyName 匹配。

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

它还处理数据的更改,我现在不再需要验证组合框。

加载数据后,我可以根据 ComboBox 中的值对行进行排序。我可能会重写 Sort 方法对文本信息进行排序。