Привязка DataGridViewCheckBoxColumn к массиву логических значений - PullRequest
0 голосов
/ 20 апреля 2011

В настоящее время я пытаюсь создать DataGridView в форме Windows для отображения пользователю списка настроек, которые они могут включать и выключать.DatGridView будет иметь два столбца, первый столбец будет описывать настройку, а второй столбец будет содержать флажок, позволяющий пользователю включить или отключить настройку.Так, например, DataGridView будет выглядеть следующим образом:

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

В моих настройках проекта у меня есть список логических значений: Pref1, Pref2, Pref3 и т. Д., Которые я хотел бы привязать к CheckBoxes в 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 заполняется, как и ожидалось, но CheckBoxes во втором столбце не может быть изменено.После некоторой отладки я заметил, что второй столбец становится ReadOnly, когда я устанавливаю DataPropertyName в значение «Value», и я не могу изменить этот параметр ReadOnly без исключения.

Есть ли способ обойти эту проблему только для чтения?Я также прочитал и подумал о создании своего собственного класса Preference в соответствии с:

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

И затем о создании массива этих предпочтений, связывая свойство Selected каждого предпочтения с одним из логических значений вмой класс настроек, а затем установить массив предпочтений в качестве источника данных DataGridViews.Это жизнеспособное решение или, может быть, есть еще одна альтернатива, которую я не рассматриваю / не знаю?

Извините за эссе вопроса, но я просто хотел бы попытаться объяснить все, чтобы не было путаницы в том, что япрошу:)

Заранее спасибо.

1 Ответ

2 голосов
/ 21 апреля 2011
GridView.DataSource = Preferences 
   .Select(p => new Preference {Description = p.Key, Selected = p.Value})
   .ToList();
GridView.Columns[0].DataPropertyName = "Description";
GridView.Columns[1].DataPropertyName = "Selected";
...