是否可以在手动添加的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。
我可以单击任何常规绑定列的标题并对表进行排序。我希望能够单击组合框列并对文本条目进行排序。
真正的解决方案是设置 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 方法对文本信息进行排序。