为ComboBox索引0添加默认值失败,遇数据源绑定异常怎么办?
解决ComboBox绑定后无法添加"Select"项的问题
错误原因
当给ComboBox设置DataSource后,其Items集合会被数据源接管,无法直接修改,执行Items.Insert(0, "Select")会抛出如下异常:
System.ArgumentException: 'Items collection cannot be modified when the DataSource property is set.'
可行解决方案
方案1:在内存DataTable中添加虚拟行(不修改数据库)
无需改动数据库,可在绑定前在内存克隆的DataTable中插入虚拟行,再绑定处理后的表:
public static void BindDropDownData(DataTable dtRecords, ComboBox dropDownListId, string textColumnName, string valueColumnName) { try { // 克隆原表结构,避免修改传入的原始DataTable DataTable tempDt = dtRecords.Clone(); // 创建虚拟行并赋值 DataRow newRow = tempDt.NewRow(); newRow[textColumnName] = "Select"; newRow[valueColumnName] = string.Empty; // 可根据业务设为0或其他默认值 // 插入到表头位置 tempDt.Rows.InsertAt(newRow, 0); // 合并原表数据到临时表 tempDt.Merge(dtRecords); // 绑定处理后的数据源 dropDownListId.DataSource = tempDt; dropDownListId.DisplayMember = textColumnName; dropDownListId.ValueMember = valueColumnName; // 默认选中第一项 dropDownListId.SelectedIndex = 0; } catch (Exception) { throw; } }
方案2:用BindingSource包装数据源
通过BindingSource灵活组合虚拟项与原表数据,无需修改DataTable结构:
public static void BindDropDownData(DataTable dtRecords, ComboBox dropDownListId, string textColumnName, string valueColumnName) { try { BindingSource bs = new BindingSource(); // 先添加虚拟项 bs.Add(new { Text = "Select", Value = string.Empty }); // 关联原DataTable作为后续数据源 bs.DataSource = dtRecords; dropDownListId.DisplayMember = textColumnName; dropDownListId.ValueMember = valueColumnName; dropDownListId.DataSource = bs; dropDownListId.SelectedIndex = 0; } catch (Exception) { throw; } }
方案3:手动添加所有项(避开DataSource限制)
若数据量较小,可直接遍历DataTable行,手动添加到ComboBox的Items集合:
public static void BindDropDownData(DataTable dtRecords, ComboBox dropDownListId, string textColumnName, string valueColumnName) { try { dropDownListId.Items.Clear(); // 添加虚拟选项 dropDownListId.Items.Add(new { Text = "Select", Value = string.Empty }); // 遍历原表添加数据项 foreach (DataRow row in dtRecords.Rows) { dropDownListId.Items.Add(new { Text = row[textColumnName].ToString(), Value = row[valueColumnName].ToString() }); } // 设置显示与值成员 dropDownListId.DisplayMember = "Text"; dropDownListId.ValueMember = "Value"; dropDownListId.SelectedIndex = 0; } catch (Exception) { throw; } }
内容的提问来源于stack exchange,提问作者Prageeth Liyanage
相关产品推荐
相关产品推荐

