将DataGridViewCheckBoxColumn绑定到布尔数组

时间:2011-04-20 11:15:38

标签: c# data-binding datagridview datagridviewcolumn

我目前正在尝试在Windows窗体中构建一个DataGridView,以向用户显示可以打开和关闭的设置列表。 DatGridView将有两列,第一列将描述设置,第二列将包含一个复选框,允许用户打开或关闭设置。例如,DataGridView看起来像:

| Descriptions        |   Set   |
---------------------------------
| Description 1       |  true   |
| Description 2       |  false  |
| Description 3       |  false  |
...

在我的项目设置中,我目前有一个布尔列表,Pref1,Pref2,Pref3等,我想将它绑定到DataGridView中的CheckBoxes,以便它们可以自动操作,而不必每次都进行任何手动检查。已编辑单元格值,因此我可以在应用程序的不同实例之间保存更改。

我尝试搜索一些解决方案并遇到以下内容并将其添加到表单构造函数中:

// Build preference dictionary
Dictionary<String, bool> Preferences = new Dictionary<String, bool>();
preferences.Add("Description 1", Settings.Default.Pref1);
preferences.Add("Description 2", Settings.Default.Pref2);
....

// Copy dictionary to list
List<KeyValuePair<String, bool>> PreferenceList = new List<KeyValuePair<String, bool>>();
foreach (KeyValuePair<String, bool> item in Preferences)
    PreferenceList.Add(item);

// Set the GridView DataSource and values displayed in each column
GridView.AutoGenerateColuns = false;
GridView.DataSource = new BindingList<KeyValuePair<String, bool>>(PreferenceList);
GridView.Columns[0].DataPropertyName = "Key";
GridView.Columns[1].DataPropertyName = "Value";

当表单加载时,DataGridView按预期填充,但无法操作第二列中的CheckBoxes。经过一些调试后,当我将DataPropertyName设置为“Value”时,我发现第二列变为ReadOnly,并且我无法在不抛出异常的情况下更改此ReadOnly设置。

有没有解决这个只读问题的方法?我还阅读并考虑过创建自己的Preference类,其中包括:

public Class Preference
{
    public String Description  { get, set }
    public bool Selected  { get, set }
}

然后创建这些首选项的数组,将每个Preference的'Selected'属性绑定到Settings类中的一个布尔值,然后将Preference数组设置为DataGridViews DataSource。这是一个可行的解决方案,还是我可能没有考虑/意识到的其他替代方案?

对于一个问题的文章感到抱歉,但我只是想尝试解释一切,所以我的要求没有混淆:)

提前致谢。

1 个答案:

答案 0 :(得分:2)

GridView.DataSource = Preferences 
   .Select(p => new Preference {Description = p.Key, Selected = p.Value})
   .ToList();
GridView.Columns[0].DataPropertyName = "Description";
GridView.Columns[1].DataPropertyName = "Selected";