2011-04-20 154 views
0

我正在尝试在Windows窗体中构建DataGridView以向用户显示可打开和关闭的设置列表。 DatGridView将有两列,第一列将描述设置,第二列将包含一个复选框,允许用户打开或关闭设置。因此,例如在DataGridView会是什么样子:将DataGridViewCheckBoxColumn绑定到布尔值数组

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

在我的项目设置,我现在有一个布尔值的列表,PREF1,PREF2,Pref3等,我想在DataGridView中绑定的复选框,以便他们可以被自动操作,而不必在单元格值被编辑时做任何手动检查,因此我可以在应用程序的不同实例之间保存更改。

我试图寻找一个几个解决方案和整个以下来了,把它添加到窗体构造函数:

// 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填充的预期,但在第二个栏的复选框不能被操纵。经过一些调试后,我没有注意到,当我将DataPropertyName设置为“Value”时,第二列变为ReadOnly,并且我无法在不引发异常的情况下更改此ReadOnly设置。

有没有解决这个只读问题的方法?我也看到了,想着创造我自己的爱好级别的东西沿着线:

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

,然后创建这些偏好的数组,每个偏好的“选择”属性绑定到我的设置中的布尔之一然后将Preference数组设置为DataGridViews DataSource。这是一个可行的解决方案,还是可能有另一个我没有考虑/意识到的选择?

对不起,问题的文章,但我只是想尝试,并解释一切,所以世界上没有混乱,我问什么:)

在此先感谢。

+0

首选项的列表将是一个不错的方式被用来去 – V4Vendetta 2011-04-20 11:30:04

+0

你的意思是我作为替代或使用目前List集合提到的优先等级的阵列? – TheRarebit 2011-04-21 08:39:45

+0

是的,类似于雅各布所建议的 – V4Vendetta 2011-04-21 08:53:01

回答

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"; 
+0

感谢您的回复@Jacob Seleznev。尽管我不得不做出一两个调整,但我已经设法使它符合您提出的建议。 Preference类中不存在p.Key和p.Value,所以我假设这是一个错字,除非我错过了某些东西? 我只需要弄清楚现在如何将Selected属性绑定到Settings.Default命名空间中的布尔值,以便它按照我的意愿工作(任何建议都将不胜感激),但现在我可以得到我想要的解决方案,非常感谢。 – TheRarebit 2011-04-26 15:21:04

+0

p不是首选p是KeyValuePair 2011-04-27 11:20:43