我有一个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列并对文本条目进行排序。
答案 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信息进行排序。